0

我有一个网络应用程序,我在其中创建了一个用于教育的嵌入式文档。工作文件看起来像这样:

"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?

4

1 回答 1

0

如果您没有在 _id 字段中提供某种标识符(可能是字符串、int 等),那么 MongoDB 会自动为您创建一个标识符,以使文档唯一(以便可以通过_ID)。_id 上通常有一个唯一索引,因此如果文档不是唯一的,则插入将失败(或者将更新现有文档等)。

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

长话短说:如果您有一个使您的文档 100% 唯一的密钥(在您的示例中可能是 :school),则将其存储为 _id,MongoDB 将为您完成艰苦的工作。

于 2012-05-15T14:52:11.690 回答