MongoDB嵌入式文件BSON ID

时间:2012-05-15 14:35:00

标签: ruby mongodb

我有一个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?

1 个答案:

答案 0 :(得分:0)

如果你没有在_id字段中提供某种标识符(它可以是String,int等),那么MongoDB会自动为你创建一个,以使文档唯一(这样就可以了通过_id查找。 _id上通常有一个唯一索引,因此如果文档不是唯一的,插入将失败(或者现有文档将被更新等)。

MongoDB使文档唯一的策略是使用ObjectID,因为它们是全局唯一的。每次创建它们时它们也是不同的 - 这就是它们在全球范围内的独特性。

长话短说:如果你有一个密钥使你的文件已经100%唯一(可能是你的例子中的学校),那么把它存储为_id,MongoDB将为你做艰苦的工作。