常规主键
生成
> ObjectId()
ObjectId("5d7f4c36a7b5867462dee50e")
提取生成的时间
> ObjectId("5d7f4c36a7b5867462dee50e").getTimestamp()
ISODate("2019-09-16T08:47:50Z")
复合主键
主键也可以使用对象来表示,即复合主键。
创建复合主键文档
> db.accounts.insert({ _id:{ "name" : "david", "balance" : 200 },"name" : "charlie", "balance" : 500 })
WriteResult({ "nInserted" : 1 })
复合主键文档ID重复性判断
> db.accounts.insert({ _id:{ "name" : "david", "balance" : 200 },"name" : "charlie", "balance" : 500 })
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.accounts index: _id_ dup key: { _id: { name: "david", balance: 200.0 } }"
}
})
# 复合主键对象key的顺序、value值、value值的类型等完全一样,方认为复合主键冲突。
> db.accounts.insert({ _id:{ "balance" : 200, "name" : "david" },"name" : "charlie", "balance" : 500 })
WriteResult({ "nInserted" : 1 })