2

DBRef我注意到在 mongodb 中可以使用字符串或对象 id 来构造 a 。例如

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") } }

谁能告诉我有什么区别以及首选哪种方式?

4

2 回答 2

3

唯一的区别是一个实际上是一个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 个字节。如果您想使用DBRefs,ObjectId如果引用的集合将ObjectIds 用于_id.

您不需要ObjectIdDBRef中使用 an 。它可以是表示_id相关集合/数据库的键 ( ) 的任何值。

正如文档所建议的那样,除非您有令人信服的理由使用 a ,否则请DBRef改用手动引用。

于 2013-04-10T13:40:37.943 回答
0

ObjectId 优点

  • 它有一个嵌入的时间戳。

  • 这是默认的 Mongo _id 类型;无处不在

  • 与其他应用程序和驱动程序的互操作性

ObjectId 缺点

  • 它是一个对象,在实践中更难操作。

  • 有时您会忘记将字符串包装在 new ObjectId() 中

  • 它需要创建服务器端对象以保持 _id 唯一性

  • 这使得通过 minimongo 在客户端生成它们有问题

字符串优点

  • 开发人员可以创建特定于域的 _id 拓扑

字符串缺点

  • 开发人员必须确保 _ids 的唯一性

  • findAndModify() 和 getNextSequence() 查询可能无效

于 2015-12-30T05:53:55.067 回答