我注意到字符串或对象id可用于在mongodb中构建DBRef
。例如
db.persons.insert({name: 'alice'})
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
db.persons.insert({name: 'bob', sister: new DBRef('persons', '5165419064fada69cef33ea2')}) // use a string
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } }
db.persons.insert({name: 'cavin', sister: new DBRef('persons', new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId
db.persons.find()
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" }
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } }
// { "_id" : ObjectId("516541e464fada69cef33ea4"), "name" : "cavin", "sister" : { "$ref" : "persons", "$id" : ObjectId("5165419064fada69cef33ea2") } }
谁能告诉我有什么不同,哪一种方式是首选? 唯一的区别是一个实际上是ObjectId
,另一个是看起来是ObjectId
的字符串表示。
DBRef作为ObjectId:
db.persons.insert({name: 'cavin',
sister: new DBRef('persons',
new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId
DBRef作为字符串:
db.persons.insert({name: 'bob',
sister: new DBRef('persons',
'5165419064fada69cef33ea2')}) // use a string
在您所包含的示例中,ObjectId
格式可以产生更有效的存储,因为它是一个12字节的值,而不是字符串表示所需的24字节。如果你想使用DBRef
s,如果引用的集合使用ObjectId
s作为_id
,我将使用ObjectId
。
您不需要在DBRef中使用ObjectId
。它可以是表示相关集合/DB的键(_id
)的任何值。
正如文档所建议的那样,除非您有令人信服的理由使用DBRef
,否则请使用手动引用。
ObjectId优点
-
它有一个嵌入的时间戳。
-
这是默认的Mongo _id类型;无处不在的
-
与其他应用程序和驱动程序的互操作性
ObjectId缺点
-
它是一个对象,在实践中更难操作。
-
有时你会忘记在new ObjectId()中包装字符串
-
需要服务器端对象创建来保持_id唯一性
-
这使得通过minimongo在客户端生成它们成为问题
字符串优点
- 开发人员可以创建特定于域的_id拓扑
字符串缺点
-
开发者必须确保_ids的唯一性
-
findAndModify()和getNextSequence()查询可能无效