255

ネストされたオブジェクト表記で mongoDB をクエリするときに問題があります。

db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
5

何が間違っているのかわかりません。ネストされたオブジェクト表記がドット表記クエリと同じ結果を返すことを期待しています。どこが間違っていますか?

4

3 に答える 3

509

db.messages.find( { headers : { From: "reservations@marriott.com" } } )

headers これはequals { From: ... }、つまり他のフィールドを含まないドキュメントを照会します。


db.messages.find( { 'headers.From': "reservations@marriott.com" } )

これはフィールドのみを調べ、にheaders.From含まれる、または欠落している他のフィールドの影響を受けませんheaders


ドット表記ドキュメント

于 2013-04-14T18:27:56.460 に答える
24

セクションSubdocumentsのドキュメントで提案されているように、2 つのクエリ メカニズムは異なる方法で機能します。

フィールドが埋め込みドキュメント (つまり、subdocument ) を保持している場合、サブドキュメント全体をフィールドの値として指定するか、ドット表記を使用してサブドキュメントに「到達」して、サブドキュメント内の個々のフィールドの値を指定できます。

サブ文書内の等価一致は、サブ文書がフィールド順序を含め、指定されたサブ文書と正確に一致する場合に文書を選択します。


次の例では、クエリは、フィールド プロデューサーの値が、 value を持つフィールドとcompanyvalueを持つフィールドのみを正確な順序で含むサブドキュメントであるすべてのドキュメントに一致します。'ABC123'address'123 Street'

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});
于 2013-04-14T18:28:19.173 に答える