Ruby MongoDB嵌入文档BSON ID

Ruby MongoDB嵌入文档BSON ID,ruby,mongodb,Ruby,Mongodb,我有一个webapp,我在其中创建了一个嵌入式教育文档。作业文档如下所示: "educations" : [ { "school" : "Brandywine High School", "major" : "Testingasdf", "grad_year" : ISODate("1979-01-01T00:00:00Z"), "school_type" : "Graduate", "_id" : Obje

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

如果您不提供某种标识符,则可以在_ID字段中提供字符串、int等,然后MongoDB将自动为您创建一个,以使文档唯一,以便可以通过_ID进行查找。通常_ID上有一个唯一的索引,因此,如果文档不是唯一的,则插入将失败,或者现有文档将被更新,等等

MongoDB使文档唯一的策略是使用ObjectID,因为它们是全局唯一的。每次你创建一个,它们都是不同的——这就是它们在全球的独特性


长话短说:如果您有一个密钥,可以使您的文档100%独一无二:示例中的学校,然后将其存储为_id,MongoDB将为您完成这项艰巨的工作。

您能否编辑您的问题以显示整个示例文档?你说的ID每次都会改变是什么意思?你能举个例子吗?更新了文档和更新的方法。我更新了帖子以更好地反映我的问题。我更喜欢它为我创造它。我已经使用MongoMapper一段时间了,当它创建ID时,一切都被发现了。但是,我要回到驱动程序中,使用原子更新嵌入文档,MongoMapper做得不好,我不明白为什么我不能让它创建嵌入文档ID。我只是看了一下你的更新-MongoDB只在顶级文档中添加了_ID。这看起来像是MongoMapper正在做的奇怪的事情。我对MongoMapper不熟悉,很遗憾,为您跟踪文档之间的引用。教育是否作为一个单独的实体存储在其他地方?如果是这样,那么我猜_id与另一个集合中该教育的_id属性相同。明白了。我认为所有嵌入的文档都会有一个ID,这样就可以通过URL引用它。我是从控制台查询教育的,它必须在运行中为它分配一个ID,如果它没有ID的话。我想我只需要使用后面的语法,这样它就会创建一个语法,这样我就可以对嵌入的元素执行常规的CRUD操作。谢谢