用字符串或ObjectId构造DBRef



我注意到字符串或对象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()查询可能无效

相关内容

  • 没有找到相关文章

最新更新