将文档的id作为ObjectId或String保存在另一个文档中是否更好?

让我们看一个简单的“坏”示例:假设我有2个集合'person'和'address' . 并假设在'地址'我想存储与地址相关联的人的'_id' . 将这个“参考密钥”项存储为'address'集合中的ObjectId vs string是否有任何好处?

我觉得将它们存放为字符串应该不会受到伤害,但我没有在mongo工作很长时间,如果我按照这种模式不知道它是否会伤到路上 .

我在这里阅读帖子:Store _Id as object or string in MongoDB?并且它说ObjectId更快,如果你使用父集合中的ObjectId获取/更新(例如,使用person._id作为ObjectId获取/更新'person'集合),我认为它是真的,但是如果通过其他集合中的字符串id表示进行搜索(在我们的示例中,通过person._id作为字符串搜索地址集合),我找不到任何暗示相同的情况 .

非常感谢您的反馈 .

回答(3)

2 years ago

无论性能如何,您都应该以与您引用的_id字段相同的格式存储“引用键” . 这意味着,如果您的推荐文件是:

{ _id: ObjectID("68746287..."), value: 'foo' }

然后你会把它称为:

{ _id: ObjectID(…parent document id…), subDoc: ObjectID("68746287...")

如果您指向的文档有一个字符串作为ID,那么它看起来像:

{ _id: "derick-address-1", value: 'foo' }

然后你会把它称为:

{ _id: ObjectID(…parent document id…), subDoc: "derick-address-1" }

除此之外,因为你在谈论人和地址,所以在两个文件中完全没有它们可能更有意义,而是嵌入文档:

{ _id: ObjectID(…parent document id…),
  'name' : 'Derick',
  'addresses' : [
     { 'type' : 'Home', 'street' : 'Victoria Road' },
     { 'type' : 'Work', 'street' : 'King William Street' },
  ]
}

2 years ago

至于使用 string 作为文档的id,在meteor collection中,您可以生成文档ID Random.id() 为字符串或 Meteor.Collection.ObjectID()ObjectId .

在这个讨论循环中,Mongodb string id vs ObjectId,这是一个很好的总结,

ObjectId Pros - 它有一个嵌入的时间戳 .

  • 它是默认的Mongo _id类型;普及
  • 与其他应用和驱动程序的互操作性
    ObjectId Cons - 它是一个对象,在实践中操作起来有点困难 .
  • 有时你会忘记在新的ObjectId()中包装你的字符串
  • 它需要创建服务器端对象以保持_id唯一性
  • 这使得通过minimongo问题生成客户端
    String Pros - 开发人员可以创建特定于域的_id拓扑
    String Cons - 开发人员必须确保_ids的唯一性
  • findAndModify()和getNextSequence()查询可能无效

以上所有这些信息都基于 meteor 框架 . 对于Mongodb,最好使用 ObjectId ,原因在于您的问题中链接的问题 .

2 years ago

将其存储为objectId是有益的 . 与使用24字节的字符串相比,ObjectId大小为12字节时速度更快 .

此外,您应该尝试对集合进行反规范化,这样您就不需要创建2个集合(与RDBMS相反) .

这样的事情一般可能更好:

{ _id : "1",
  person : { 
             Name : "abc",
             age: 20
           },
  address : { 
             street : "1st main",
             city: "Bangalore",
             country: "India"
            }
}

但同样,这取决于您的用例 . 这有时可能不合适 .

希望有所帮助! :)