MongoDB学习笔记06-MongoDB在Shell中执行增

添加集合并插入一个文档

db.集合名.insert({...})

> db.person.insert({"name":"zhang","age":15})
WriteResult({ "nInserted" : 1 })
>

注意:MongoDB会自动为该文档加入一个_id的key,但是如果要插入的文档中已经包含了_idkey,则不会再自动添加了

以上执行insert时候传入的是一个对象,那么传入的是一个对象数组呢?如下图:如果插入时传入的是一个对象数组,那么会为该对象数组中的每一个对象插入一个文档。

> db.person.insert([{"name":"zhang","age":15},{"name":"wang","age":22}])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
> db.person.find()

{ "_id" : ObjectId("556bf3da361be67b8f01af25"), "name" : "zhang", "age" : 15 }
{ "_id" : ObjectId("556bf3da361be67b8f01af26"), "name" : "wang", "age" : 22 }
>

如果采用save方法遇到已经存在的_id,则不会报错,它其实是把已经存在的_id的那个文档进行更新;当然,如果要插入的文档的_id值还不存在,则插入新文档

> db.person.find()
{ "_id" : 1002, "name" : "zhang", "age" : 15 }
> db.person.save({"_id":1002,"name":"wang","age":30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find()
{ "_id" : 1002, "name" : "wang", "age" : 30 }
>

插入文档数组

定义变量 mydocuments 用于保存待插入的文档数组。

> var mydocuments =
     [
       {
         item: "ABC2",
         details: { model: "14Q3", manufacturer: "M1 Corporation"},
         stock: [ { size: "M", qty: 50 } ],
         category: "clothing"
       },
       {
         item: "MNO2",
         details: { model: "14Q3", manufacturer: "ABC Company" },
         stock: [ { size: "S", qty: 5 }, { size: "M", qty: 5 }, { size: "L",
qty: 1 } ],
         category: "clothing"
       },
       {
         item: "IJK2",
         details: { model: "14Q2", manufacturer: "M5 Corporation"},
         stock: [ { size: "S", qty: 5 }, { size: "L", qty: 1 } ],
         category: "houseware"
       }
     ];

传递数组 mydocuments 到方法 db.collection.insert() 执行批量插入。

db.inventory.insert( mydocuments );

该方法返回包含操作状态的 BulkWriteResult 对象。若插入成功将返回如下对象:

BulkWriteResult({
   "writeErrors" : [ ],
   "writeConcernErrors" : [ ],
   "nInserted" : 3,
   "nUpserted" : 0,
   "nMatched" : 0,
   "nModified" : 0,
   "nRemoved" : 0,
   "upserted" : [ ]
})

用 Bulk 插入多个文档

3.2 版本提供了db.collection.bulkWrite 进行批量操作
2.6 新版功能
MongoDB提供一个用于执行批量写入的 Bulk() API。以下操作步骤描述了如何使用 Bulk() API向MongoDB集合中插入一组文档。

初始化一个操作构建器 Bulk

给集合 inventory 初始化一个操作构建器 Bulk

var bulk = db.inventory.initializeUnorderedBulkOp();

该操作返回一个无序的操作构建器,维护了所有待执行的操作列表。无序操作意味着MongoDB能够以平行方式执行,也可以用非确定性顺序的方式执行列表中的操作。如果当执行其中一个写操作时出现错误,MongoDB将继续执行列表中其他剩余的写操作。
你也可初始化一个有序的操作构建器;详见 db.collection.initializeOrderedBulkOp()

向 bulk 对象中添加插入操作

使用 Bulk.insert() 方法向 bulk 对象中添加两个插入操作。

bulk.insert(
   {
     item: "BE10",
     details: { model: "14Q2", manufacturer: "XYZ Company" },
     stock: [ { size: "L", qty: 5 } ],
     category: "clothing"
   }
);
bulk.insert(
   {
     item: "ZYT1",
     details: { model: "14Q1", manufacturer: "ABC Company"  },
     stock: [ { size: "S", qty: 5 }, { size: "M", qty: 5 } ],
     category: "houseware"
   }
);

向 bulk 对象中添加查询修改删除操作

bulk.find( { status: "D" } ).remove(); # 还有 removeOne() 操作
bulk.find( { status: "P" } ).update( { $set: { comment: "Pending" } } );
bulk.find( { item: "abc123" } ).replaceOne( { item: "abc123", status: "P", points: 100 } ); # _id还在不变
bulk.find( { item: "abc123" } ).upsert().replaceOne( { item: "abc123", status: "P", points: 100 } ); # 如果没找到那么进行插入操作,
# 后面可以跟的操作 Bulk.find.replaceOne(),Bulk.find.updateOne(),Bulk.find.update()

Bulk.getOperations()

循环插入1500条数据,同样可以进行UpdateRemove操作

var bulk = db.items.initializeUnorderedBulkOp();
for (var i = 1; i <= 1500; i++) {
    bulk.insert( { x: i } );
}
bulk.execute();
bulk.getOperations();

执行批量操作

调用 bulk 对象的 execute() 方法以执行 bulk 对象列表中的所有操作。

bulk.execute();

该方法返回包含操作状态的 BulkWriteResult 对象。若插入成功将返回如下对象:

BulkWriteResult({
   "writeErrors" : [ ],
   "writeConcernErrors" : [ ],
   "nInserted" : 2,
   "nUpserted" : 0,
   "nMatched" : 0,
   "nModified" : 0,
   "nRemoved" : 0,
   "upserted" : [ ]
})

3.2 版本后还有以下几种语法可用于插入文档

db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据

#  插入单条数据

> var document = db.collection.insertOne({"a": 3})
> document
{
    "acknowledged" : true,
    "insertedId" : ObjectId("571a218011a82a1d94c02333")
}

#  插入多条数据
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
    "acknowledged" : true,
    "insertedIds" : [
            ObjectId("571a22a911a82a1d94c02337"),
            ObjectId("571a22a911a82a1d94c02338")
    ]
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:MongoDB学习笔记06-MongoDB在Shell中执行增

文章字数:1.2k

本文作者:Bin

发布时间:2017-07-17, 16:21:38

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2017/07/17/MongoDB/MongoDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B006-MongoDB%E5%9C%A8Shell%E4%B8%AD%E6%89%A7%E8%A1%8C%E5%A2%9E/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录