MongoDB Create 操作笔记

Mongo shell Create 操作

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。
      # 
   }
)

注意:

  1. 当 ordered=true 顺序插入时,其中某一条出错,就会终止插入行为,剩余的文档无论正确与否,都不会被写入
  2. 当 ordered=false 无序插入时,其中某一条出错,不会终止插入行为,将所有正确的文档全部插入,错误的会返回错误信息

示例:详见官方文档

3. insertOne、insertMany、insert 的区别:

  1. 返回结果不一样
  2. insertOne、insertMany 不支持 db.collection.explain() 命令
  3. insert 支持 db.collection.explain() 命令

4. db.collection.save() 命令

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
  1. 该save()方法使用 insert或update命令
  2. 如果文档不不包含_id字段,那么 save()方法调用的 insert()方法。在操作过程中, mongoshell将创建一个ObjectId并将其分配给该_id字段。
  3. 如果文档包含_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 })
posted @ 2022-10-12 00:53  郭赫伟  阅读(246)  评论(0编辑  收藏  举报