0

学校オブジェクトに次の構造があるとします。

{ 
  "grade_spans" : 
  {
       "0": { 
         "grade_span_key" : "K_5",
         "name":  "Elementary School"
       }, 
       "1": { 
         "grade_span_key" : "6_8",
         "name":  "Junior High-School"
       }
  }
}

特定の grade_span_key の学校を見つけるにはどうすればよいですか?

db.schools.find({ "grade_span_key": "K_5" }) 

空を返します。

更新:申し訳ありませんが、構造を間違ってコピーしました。これは実際にはコレクションではなく埋め込みオブジェクトです。

更新 #2 : 間違って使用していた doctrine2 注釈がありました: @MongoDB\EmbedMany(strategy="set")。戦略を pushAll に変更します (これがデフォルトです)

4

3 に答える 3

0

プロパティへのフル パスをドット表記で使用する必要があります。

> db.schools.find({"grade_spans.grade_span_key": "K_5"})
{
    "_id" : ObjectId("50801cc5ab582e310adc0e41"),
    "grade_spans" : [
        {
            "grade_span_key" : "K_5",
            "name" : "Elementary School"
        },
        {
            "grade_span_key" : "6_8",
            "name" : "Junior High-School"
        }
    ]
}
于 2012-10-18T15:15:19.947 に答える
0

このフィールドがメイン ドキュメントに埋め込まれている場合、@sergios の回答は問題なく機能しますが、埋め込まれた構造のみのドキュメント構造の例を提供していないため、彼のクエリが機能しない理由は明らかではありません。

また、@JohnnyHK が言うように、この場合の動的キーは難しいため、そのオブジェクトを配列として再構築します。

完全なドキュメントではなく、埋め込まれたドキュメントから一致する行を選択する場合。これは少し難しいですが、可能です:

db.schools.aggregate({
    {$unwind: "$grade_spans"}, 
    {$match: {"grade_spans.grade_span_key": "K_5"}}, 
    {$group: {_id: "$_id", grade_spans: {$push: "$grade_spans"}}}
})

上記のようなものは、構造のドキュメントを返すはずです:

{
    _id: {},
    grade_spans:[{
        "grade_span_key" : "K_5",
        "name" : "Elementary School"        
    }]
}
于 2012-10-18T15:37:30.320 に答える