我有一个webapp,我为教育创建了一个嵌入式文档。工作文件看起来像这样:
"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?
答案 0 :(得分:0)
如果你没有在_id字段中提供某种标识符(它可以是String,int等),那么MongoDB会自动为你创建一个,以使文档唯一(这样就可以了通过_id查找。 _id上通常有一个唯一索引,因此如果文档不是唯一的,插入将失败(或者现有文档将被更新等)。
MongoDB使文档唯一的策略是使用ObjectID,因为它们是全局唯一的。每次创建它们时它们也是不同的 - 这就是它们在全球范围内的独特性。
长话短说:如果你有一个密钥使你的文件已经100%唯一(可能是你的例子中的学校),那么把它存储为_id,MongoDB将为你做艰苦的工作。