我有一个网络应用程序,我在其中创建了一个用于教育的嵌入式文档。作业文档如下所示:
"educations" : [
{
"school" : "Brandywine High School",
"major" : "Testingasdf",
"grad_year" : ISODate("1979-01-01T00:00:00Z"),
"school_type" : "Graduate",
"_id" : ObjectId("4fb26c9ce5be08208b000ce4")
}
],
"email" : "user@domain.com",
教育哈希包含工作的详细信息。我注意到,如果我创建没有 ID 的哈希:
User.collection.update(
{ _id: @user.id },
{ :$push => { educations: education } },
{ safe: true }
)
我从 Rails 控制台查询教育,每次 ID 都会更改:
irb(main):004:0> User.brandon.educations.map(&:id)
=> [BSON::ObjectId('4fb26e13e5be082384000007')]
irb(main):005:0> User.brandon.educations.map(&:id)
=> [BSON::ObjectId('4fb26e13e5be082384000009')]
但是,如果我这样做:
User.collection.update(
{ _id: @user.id },
{ :$push => { educations: BSON::ObjectId.create_pk(education) } },
{ safe: true }
)
每次从控制台查询时,ID 都相同。因此,我在引用教育以在浏览器中编辑嵌入式文档时遇到了麻烦。
创建嵌入文档时,是否始终必须提供 BSON ID?
如果您没有在_id字段中提供某种标识符(可能是字符串,整数等),那么MongoDB将自动为您创建一个标识符,以使文档唯一(以便可以通过_id查找)。_id上通常有一个唯一的索引,因此如果文档不唯一,插入将失败(或者现有文档将改为更新,等等)。
MongoDB使文档唯一的策略是使用ObjectID,因为它们是全局唯一的。每次创建它们时它们也不同 - 这就是它们在全球范围内独一无二的原因。
长话短说:如果你有一个密钥,让你的文档已经100%唯一(在你的例子中可能是:school),那么把它存储为_id,MongoDB将为你完成艰苦的工作。