MongoDB Create 操作笔记
Mongo shell Create 操作
- 官方文档地址:https://www.mongodb.com/docs/manual/reference/insert-methods/
 - 中文文档地址:https://mongodb.net.cn/manual/reference/insert-methods/
 
Create 操作
- db.collection.insertOne() 将单个文档插入集合中
 - db.collection.insertMany() 可以将多个文档插入一个集合中
 - db.collection.insert()
 - 其他写操作
- db.collection.update() 当使用[upsert: true]选项时
 - db.collection.updateOne() 当使用[upsert: true]选项时
 - db.collection.updateMany() 当使用[upsert: true]选项时
 - db.collection.findAndModify() 当使用[upsert: true]选项时
 - db.collection.findOneAndUpdate() 当使用[upsert: true]选项时
 - db.collection.findOneAndReplace() 当使用[upsert: true]选项时
 - db.collection.save()。
 - db.collection.bulkWrite()。
 
 
1. db.collection.insertOne()
db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>       # writeConcern 指定文档创建操作的安全写级别, 级别越高,写操作越安全,延时越高
   }
)
> db.my_test.insertOne({name: "hua", balance: 100})      # my_test 集合如果没有创建将会自动创建
{
	"acknowledged" : true,                               # true 表示 [acknowledged] 安全写级别被启动 (默认写级别)
	"insertedId" : ObjectId("6326fa2289c04594a4b8f66f")  # 写入文档的主键 _id, 创建时不指定,会自动生成
}
> db.my_test.insertOne({_id: "account1", balance: 100})
{ "acknowledged" : true, "insertedId" : "account1" }
> db.my_test.insertOne({_id: "account1", balance: 100})
WriteError({
	"index" : 0,
	"code" : 11000,
	"errmsg" : "E11000 duplicate key error collection: test.my_test index: _id_ dup key: { _id: \"account1\" }",
	"op" : {                 # 创建文档的内容     
		"_id" : "account1",
		"balance" : 100
	}
})
2. db.collection.insertMany()
db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean> 
      # ordered 可选的。一个布尔值,指定mongod实例应执行有序插入还是无序插入。默认为true。
      # 
   }
)
注意:
- 当 ordered=true 顺序插入时,其中某一条出错,就会终止插入行为,剩余的文档无论正确与否,都不会被写入
 - 当 ordered=false 无序插入时,其中某一条出错,不会终止插入行为,将所有正确的文档全部插入,错误的会返回错误信息
 
示例:详见官方文档
3. insertOne、insertMany、insert 的区别:
- 返回结果不一样
 - insertOne、insertMany 不支持 db.collection.explain() 命令
 - insert 支持 db.collection.explain() 命令
 
4. db.collection.save() 命令
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
- 该save()方法使用 insert或update命令
 - 如果文档不不包含_id字段,那么 save()方法调用的 insert()方法。在操作过程中, mongoshell将创建一个ObjectId并将其分配给该_id字段。
 - 如果文档包含_id字段,则该 save()方法等效于将upsert选项设置为true且_id字段上的查询谓词的更新。
 
5. 文档主键
默认文档主键 objectId
> ObjectId()
ObjectId("6327064d89c04594a4b8f674")
> ObjectId("6327064d89c04594a4b8f674")
ObjectId("6327064d89c04594a4b8f674")
> ObjectId("6327064d89c04594a4b8f674").getTimestamp()   # 获取objectId的创建时间
ISODate("2021-09-18T11:51:41Z")
复合主键(使用文档作为文档主键)
# 1. 写入复合主键文档
> db.accounts.insert(
  {
    _id:{accoountNo: "001", type: "savings"}, 
    name: "irene", 
    balance: 80
  }
)
WriteResult({ "nInserted" : 1 })
# 2. 重复写入主键重复报错
> db.accounts.insert(
  {
    _id:{accoountNo: "001", type: "savings"}, 
    name: "irene", 
    balance: 80
  }
)
WriteResult({
	"nInserted" : 0,
	"writeError" : {
		"code" : 11000,
		"errmsg" : "E11000 duplicate key error collection: test.accounts index: _id_ dup key: { _id: { accoountNo: \"001\", type: \"savings\" } }"
	}
})
# 3. 主键文档交换位置,可以重复写入
> db.accounts.insert(
  {
    _id:{type: "savings", accoountNo: "001"}, 
    name: "irene", 
    balance: 80
  }
)
WriteResult({ "nInserted" : 1 })

                
            
        
浙公网安备 33010602011771号