回答:
db.messages.find( { headers : { From: "reservations@marriott.com" } } )
これheaders
は { From: ... }
、等しい、つまり他のフィールドを含まないドキュメントを照会します。
db.messages.find( { 'headers.From': "reservations@marriott.com" } )
これはheaders.From
フィールドのみを確認し、に含まれている、またはから欠落している他のフィールドの影響を受けませんheaders
。
conditions['some.path'] = 'value'
:私のビジネスロジックでは、その後、最後に単一のクエリを実行find(conditions, fields, callback);
domains.domain.com
。これは機能しません。このシナリオの回避策はありますか(domain.comを他のもの(domain_comなど)に変更せずに)?
2つのクエリメカニズムは、サブドキュメントセクションのドキュメントで提案されているように、さまざまな方法で機能します。
フィールドが埋め込まれた文書(すなわち、保持しているときにサブドキュメントを)、あなたはどちらか全体を指定することができますサブドキュメントを「に到達する」フィールドの値として、またはサブドキュメント内の個々のフィールドの値を指定するために、ドット表記を使用したサブ文書を:
サブドキュメントがフィールド順序を含め、指定されたサブドキュメントと完全に一致する場合、サブドキュメント内の同等一致はドキュメントを選択します。
次の例では、クエリは、フィールドプロデューサーの値がフィールドのみが含まれているサブ文書のすべての文書と一致するcompany
値と'ABC123'
し、フィールドaddress
値を持つ'123 Street'
:正確な順序では、
db.inventory.find( {
producer: {
company: 'ABC123',
address: '123 Street'
}
});
サブドキュメントを使用したMongoDBコレクションのクエリについては多くの混乱があるため、上記の回答を例で説明することは価値があると思いました。
まず、コレクションにオブジェクトを2つだけ挿入しmessage
ました。
> db.messages.find().pretty()
{
"_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
"headers" : {
"From" : "reservations@marriott.com"
}
}
{
"_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
"headers" : {
"From" : "reservations@marriott.com",
"To" : "kprasad.iitd@gmail.com"
}
}
>
だからクエリの結果は何ですか:
db.messages.find({headers: {From: "reservations@marriott.com"} }).count()
オブジェクトと等しいドキュメントに対するこれらのクエリ、つまり他のフィールドが含まれていないか、サブドキュメント全体をフィールドの値として指定する必要があるため、これらのクエリは1である必要があります。headers
{From: "reservations@marriott.com"}
@ Edmondo1984からの回答に従って
サブドキュメント内の等価一致では、サブドキュメントがフィールドの順序を含め、指定されたサブドキュメントと完全に一致する場合、ドキュメントが選択されます。
上記のステートメントから、以下のクエリ結果はどうあるべきですか?
> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"} }).count()
0
そして、もし私たちが2番目のドキュメントのサブドキュメントの順序を変更するFrom
、To
つまり同じ場合はどうでしょうか?
> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"} }).count()
1
そのため、フィールドの順序を含め、指定されたサブドキュメントと完全に一致します。
ドット演算子を使用する場合、私はそれがすべての人にとって非常に明確だと思います。以下のクエリの結果を見てみましょう:
> db.messages.find( { 'headers.From': "reservations@marriott.com" } ).count()
2
上記の例に関するこれらの説明が、サブドキュメントを使用した検索クエリをより明確にすることを願っています。