Bulk.find.upsert()

在本页面

Tip

从 3.2 版开始,MongoDB 还提供了db.collection.bulkWrite()方法来执行批量写入操作。

Description

  • Bulk.find. upsert ( )
    • 2.6 版的新功能。

upsert选项设置为 true 以进行更新或替换操作,并具有以下语法:

Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);

upsert选项设置为true的情况下,如果针对Bulk.find()条件不存在匹配的文档,则更新或替换操作将执行插入。如果存在匹配的文档,则更新或替换操作将执行指定的更新或替换。

Bulk.find.upsert()与以下写入操作配合使用:

Behavior

以下描述了与Bulk.find.upsert()结合使用时各种写入操作的插入行为。

插入 Bulk.find.replaceOne()

Bulk.find.replaceOne()方法接受仅包含字段和值对的替换文档作为其参数:

var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { item: "abc123" } ).upsert().replaceOne(
   {
     item: "abc123",
     status: "P",
     points: 100,
   }
);
bulk.execute();

如果使用Bulk.find.upsert()选项进行替换操作执行插入操作,则插入的文档就是替换文档。如果替换文档和查询文档均未指定_id字段,则 MongoDB 将添加_id字段:

{
  "_id" : ObjectId("52ded3b398ca567f5c97ac9e"),
  "item" : "abc123",
  "status" : "P",
  "points" : 100
}

插入 Bulk.find.updateOne()

Bulk.find.updateOne()方法接受仅包含字段和值对或仅update operator表达式的更新文档作为其参数。

字段和值对

如果更新文档仅包含字段和值对:

var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "P" } ).upsert().updateOne(
   {
     item: "TBD",
     points: 0,
     inStock: true,
     status: "I"
   }
);
bulk.execute();

然后,如果使用Bulk.find.upsert()选项进行的更新操作执行插入操作,则插入的文档就是更新文档。如果更新文档和查询文档均未指定_id字段,则 MongoDB 将添加_id字段:

{
  "_id" : ObjectId("52ded5a898ca567f5c97ac9f"),
  "item" : "TBD",
  "points" : 0,
  "inStock" : true,
  "status" : "I"
}

更新运算符表达式

如果更新文档仅包含update operator个表达式:

var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "P", item: null } ).upsert().updateOne(
   {
     $setOnInsert: { defaultQty: 0, inStock: true },
     $currentDate: { lastModified: true },
     $set: { points: "0" }
   }
);
bulk.execute();

然后,如果使用Bulk.find.upsert()选项进行的更新操作执行插入操作,则更新操作将插入具有Bulk.find()方法的查询文档中包含字段和值的文档,然后从更新文档中应用指定的更新。如果更新文档和查询文档均未指定_id字段,则 MongoDB 将添加_id字段:

{
   "_id" : ObjectId("52ded68c98ca567f5c97aca0"),
   "item" : null,
   "status" : "P",
   "defaultQty" : 0,
   "inStock" : true,
   "lastModified" : ISODate("2014-01-21T20:20:28.786Z"),
   "points" : "0"
}

插入 Bulk.find.update()

当将upsert()与多文档更新方法Bulk.find.update()一起使用时,如果没有文档符合查询条件,则更新操作将插入**单个文档。

Bulk.find.update()方法接受包含* only * update operator表达式的更新文档作为其参数:

var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "P" } ).upsert().update(
   {
     $setOnInsert: { defaultQty: 0, inStock: true },
     $currentDate: { lastModified: true },
     $set: { status: "I", points: "0" }
   }
);
bulk.execute();

然后,如果使用Bulk.find.upsert()选项进行的更新操作执行插入操作,则更新操作将插入具有Bulk.find()方法的查询文档中的字段和值的单个文档,然后从更新文档中应用指定的更新。如果更新文档和查询文档均未指定_id字段,则 MongoDB 将添加_id字段:

{
   "_id": ObjectId("52ded81a98ca567f5c97aca1"),
   "status": "I",
   "defaultQty": 0,
   "inStock": true,
   "lastModified": ISODate("2014-01-21T20:27:06.691Z"),
   "points": "0"
}