0

教育用の埋め込みドキュメントを作成する 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 を指定する必要がありますか?

4

1 に答える 1

0

_id フィールドに何らかの識別子 (文字列、int など) を指定しない場合、MongoDB は自動的に作成し、ドキュメントを一意にします (そのため、 _id)。通常、_id には一意のインデックスがあるため、ドキュメントが一意でない場合、挿入は失敗します (または、代わりに既存のドキュメントが更新されるなど)。

ドキュメントを一意にするための MongoDB の戦略は、ObjectID を使用することです。これらはグローバルに一意であるためです。また、作成するたびに異なります。つまり、グローバルにユニークです。

手短に言えば、ドキュメントをすでに 100% 一意にするキーを持っている場合 (おそらく、例では :school )、それを _id として保存すると、MongoDB が面倒な作業を行います。

于 2012-05-15T14:52:11.690 に答える