MongoDB嵌入式文档BSON ID



我有一个网络应用程序,我在其中创建了一个用于教育的嵌入式文档。作业文档如下所示:

"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将为你完成艰苦的工作。

最新更新