2012-05-15 165 views
0

我在那里,我创造了的教育嵌入文档web应用程序。这份工作文件看起来像这样: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" : "[email protected]", 

教育杂凑具有工作的细节。我注意到,如果我没有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

您可以编辑您的问题,以显示整个样本文档? “这个ID每次都会改变”是什么意思?你能举一个这样的例子吗? –

+0

更新了文档和用于更新的方法。 – user577808

回答

0

如果不提供某种形式的标识符(它可能是一个字符串,一个int等)在_id字段,然后MongoDB的将自动为您创建一个,使文档唯一的(从而能被_id抬起头)。 _id通常具有唯一索引,因此如果文档不是唯一的,插入将失败(或者现有文档将被更新,等等)。

MongoDB的战略,使文档独特之处是使用一个对象ID,因为这些是全球唯一的。每当你创造一个时,它们也是不同的 - 这就是它们在全球独一无二的原因。长话短说:如果你有一个使你的文档已经100%独特的密钥(可能:你的例子中的学校),然后将它存储为_id,并且MongoDB将为你完成艰苦的工作。

+0

我已更新帖子以更好地反映我的问题。我宁愿它为我创造它。我一直在使用MongoMapper,并且在创建ID时找到了一切。不过,我要回驱动程序使用原子更新嵌入式文档,这MongoMapper做得不好,我很困惑,为什么我不能拥有它创建嵌入的文件编号。 – user577808

+1

我只是看看你的更新 - MongoDB只在顶级文档中添加_id。这看起来像MongoMapper正在做的事情(我不熟悉MongoMapper,很不幸)跟踪文档之间的引用。教育是否作为一个单独的实体存储在其他地方?如果是这样,那么我的猜测是_id与其他馆藏中该教育的_id属性相同。 –

+0

Gotcha。我认为所有的嵌入式文档都会有一个ID,以便通过URL引用它。我在查询控制台的教育信息,如果它没有一个,它就必须随时为它分配一个ID。我想我只需要用我的后一种语法来创建一个,这样我就可以对嵌入元素执行通常的CRUD操作。谢谢! – user577808