MongoDB 基础操作之新增操作

插入

MongoDB 中,可以通过插入指令将文档数据新增至集合中,最常用的为 insert()save()。除此之外,还有interOne()interMany(),不过 insert() 已涵盖这两个指令的功能。

1.1.1 insert()

此方法是插入文档最常用的方法,可以插入单笔或多笔文档。

(1) 语法格式

> db.collection.insert(

    <document or array of documents > ,

    {

        writeConcern: < document > ,

        ordered: < boolean >

    }

)
(2) 参数说明
  • document or array of documents: 要被插入的文档或数组。可以控制插入一笔或多笔文档。

    --- 当插入一笔文档时,文档内容放置在{ }中,如:{ doc }

    --- 当插入多笔文档时,单笔文档放置在 { } 中,然后将所有文档一起放置在 [ ] 中,如: [ { doc1 }, { doc2 } ]

  • writeConcern: 此为可选参数。表示是否使用写入策略。

  • ordered: 可选参数。表示插入文档时是否为有序插入。默认为 true

    --- 若为有序插入,则当插入的文档中有一个发生错误时,MongoDB 将不再继续插入后续的文档。

    --- 若为无序插入,则当插入的文档中有一个文档发生错误时,MongoDB 将会继续插入后续的文档。

(3) 范例

> db.Product.insert(

    [{

            SysNo: 2971,

            ProductName: "DE - 1300 Earbuds",

            Weight: 465,

            ProductMode: "Set"

        },

        {

            SysNo: 8622,

            ProductName: "( Role Gold) 16GB",

            Weight: 143,

            ProductMode: ""

        }

    ],

    {

        writeConcern: {
            w: "majority",
            j: true,
            wtimeout: 5000
        }, // 写入大多数节点,写入日志,限时 5000ms ordered: false

    }

)


// 执行结果
BulkWriteResult({

    "writeErrors": [],

    "writeConcernErrors": [],

    "nInserted": 2,

    "nUpserted": 0,

    "nMatched": 0,

    "nModified": 0,

    "nRemoved": 0,

    "upserted": []

})

使用find() 对集合进行查询,并且使用pretty()将结果使用更易读的方式显示出来,具体指令如下:

> db.Product.find()

// 执行结果
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }

{ "_id" : ObjectId("60da83996350a57504489e73"), "SysNo" : 2971, "ProductName" : "DE - 1300 Earbuds", "Weight" : 465, "ProductMode" : "Set" }

{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 8622, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "" }
 > db.Product.find().pretty()

// 执行结果
{

    "_id": ObjectId("60da7be26350a57504489e72"),

    "ProductNname": "Rarbus",

    "SysNo": 123,

    "Weigth": 122,

    "ProductMode": ""

}

{

    "_id": ObjectId("60da83996350a57504489e73"),

    "SysNo": 2971,

    "ProductName": "DE - 1300 Earbuds",

    "Weight": 465,

    "ProductMode": "Set"

}

{

    "_id": ObjectId("60da83996350a57504489e74"),

    "SysNo": 8622,

    "ProductName": "( Role Gold) 16GB",

    "Weight": 143,

    "ProductMode": ""

}
(4) 插入文档的三个特点:
  • 如果没有指定数据库,则在插入文档时会自动创建一个名为test的数据库。
  • 在插入文档时,如果没有此集合,则MongoDB会自动创建这个集合名称。
  • 在插入文档时,若没有指定_id字段,则MongiDB会自动增加一个_id字段,默认是ObjectId类型,其值在集合中是不能重复的;若指定_id字段,则其值是不能重复的,可以是数字或字符串类型。
1.1.2 save()

此方法为常用的插入方法之一,它与 insert()不同之处是:使用insert()方法插入主键相同的文档时会报错,而使用save()方法插入已存在相同主键的文档时则会覆盖原文档。

> db.Product.insert({ProductNname: "Rarbus", SysNo: 123, Weigth: 122, ProductMode:"", _id:1})
WriteResult({ "nInserted" : 1 })
> db.Product.insert({ProductNname: "Rarbus", SysNo: 123, Weigth: 122, ProductMode:"", _id:1})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: test.Product index: _id_ dup key: { _id: 1.0 }"
    }
})


> db.Product.save({ProductNname: "Rarbus666", SysNo: 789, Weigth: 678, ProductMode:"", _id:3})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 3 })

> db.Product.save({ProductNname: "Rarbus999999", SysNo: 666666, Weigth: 888888, ProductMode:"addf", _id:3})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.Product.find().pretty()
{
    "_id" : ObjectId("60da7be26350a57504489e72"),
    "ProductNname" : "Rarbus",
    "SysNo" : 123,
    "Weigth" : 122,
    "ProductMode" : ""
}
{
    "_id" : ObjectId("60da83996350a57504489e73"),
    "SysNo" : 2971,
    "ProductName" : "DE - 1300 Earbuds",
    "Weight" : 465,
    "ProductMode" : "Set"
}
{
    "_id" : ObjectId("60da83996350a57504489e74"),
    "SysNo" : 8622,
    "ProductName" : "( Role Gold) 16GB",
    "Weight" : 143,
    "ProductMode" : ""
}
{
    "_id" : 1,
    "ProductNname" : "Rarbus",
    "SysNo" : 123,
    "Weigth" : 122,
    "ProductMode" : ""
}
{
    "_id" : ObjectId("60da90d46350a57504489e75"),
    "ProductNname" : "Rarbus",
    "SysNo" : 123,
    "Weigth" : 122,
    "ProductMode" : ""
}
{
    "_id" : 2,
    "ProductNname" : "Rarbus",
    "SysNo" : 333,
    "Weigth" : 222,
    "ProductMode" : ""
}
{
    "_id" : ObjectId("60da91676350a57504489e76"),
    "ProductNname" : "Rarbus",
    "SysNo" : 123,
    "Weigth" : 122,
    "ProductMode" : ""
}
{
    "_id" : ObjectId("60da91866350a57504489e77"),
    "ProductNname" : "Rarbus",
    "SysNo" : 123,
    "Weigth" : 122,
    "ProductMode" : ""
}
{
    "_id" : 3,
    "ProductNname" : "Rarbus999999",
    "SysNo" : 666666,
    "Weigth" : 888888,
    "ProductMode" : "addf"
}
(1) 语法格式
db.collection.save(
     < document > , 
     {
       writeConcern: < document >
     }
)
(2) 范例

使用save()方法向集合中插入一个文档,指令如下:

> db.Product.save({ProductNname: "Rarbus", SysNo: 123, Weigth: 122, ProductMode:""})

WriteResult({ "nInserted" : 1 })

查看文档指令:

> db.Product.find({
    "Weigth": 88888888
}) 


{
    "_id": ObjectId("60da99fd6350a57504489e78"), // 未指定_id,则生成唯一值
    "ProductNname": "Rarbus999999999",
    "SysNo": 666666,
    "Weigth": 88888888,
    "ProductMode": "addf"
}

若保存的是_id重复的文档,则会直接覆盖此数据。此例为修改ProductMode字段值,并移除两个字段,具体指令如下:

> db.Product.save({
    "_id": ObjectId("60da99fd6350a57504489e78"),
    "Weigth": 88888888,
    "ProductMode": "Set"
})


WriteResult({
    "nMatched": 1,
    "nUpserted": 0,
    "nModified": 1
})

使用save()方法插入多条数据

> db.Product.save([{ "Weigth" : 888888881, "ProductMode" : "Set1"}, { "Weigth" : 888888882, "ProductMode" : "Set2" }])

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

查看文档数据:

> db.Product.find({"Weigth": 88888888}).pretty()
{
    "_id": ObjectId("60da99fd6350a57504489e78"),
    "Weigth": 88888888,
    "ProductMode": "Set"
}
3. insertOne()

同样作为插入文档的方法,insertOne()只能插入一笔文档。如果使用这个方法插入多笔文档,则MongoDB只会新增第一笔文档。

(1) 语法格式:
db.collection.insertOne(
     < document > , 
     {
       writeConcern: < document >
     }
)
(2) 范例

使用insertOne()方法插入一笔文档,指令如下:

> db.Product.insertOne({ "Weigth" : 888888883, "ProductMode" : "Set3"})

{
    "acknowledged" : true,
    "insertedId" : ObjectId("60da9f166350a57504489e7c")
}

使用insertOne()方法插入多条数据报错(系统环境:CentOS Linux release 7.9.2009 (Core)MongoDB 版本:v4.4.6改版还是指令错误???

> db.Product.insertOne([{ "Weigth" : 88888888666, "ProductMode" : "6Set6"}, { "Weigth" : 5888888885, "ProductMode" : "Set5" }])

uncaught exception: Error: operation passed in cannot be an Array :
addToOperationsList@src/mongo/shell/bulk_api.js:604:23
Bulk/this.insert@src/mongo/shell/bulk_api.js:650:20
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:260:5
@(shell):1:1
4. insertMany()

insertMany()可以插入多个文档,插入方法与insert()方法相同。

(1) 语法格式:
db.collection.insertMany(
    [ < document1 > , < document2 > , ...], 
        {

        writeConcern: < document > ,

        ordered: < boolean >

    }
)
(2) 范例
> db.Product.insertMany([{ "Weigth" : 88888888666, "ProductMode" : "6Set6"}, { "Weigth" : 5888888885, "ProductMode" : "Set5" }])

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("60daa7b1063796028af0b87c"),
        ObjectId("60daa7b1063796028af0b87d")
    ]
}

使用insertMany()方法插入单条文档时报错(系统环境:CentOS Linux release 7.9.2009 (Core)MongoDB 版本:v4.4.6

> db.Product.insertMany({ "Weigth" : 8888888866677777, "ProductMode" : "6Set67799999999777"})

uncaught exception: TypeError: documents.map is not a function :
DBCollection.prototype.insertMany@src/mongo/shell/crud_api.js:307:17
@(shell):1:1
摘抄于《MoongoDB 从入门到商业实战》
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容