[mongodb] 중첩 된 객체를 쿼리하는 방법?

중첩 된 객체 표기법으로 mongoDB를 쿼리 할 때 문제가 있습니다.

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

내가 뭘 잘못하고 있는지 알 수 없습니다. 중첩 된 객체 표기법이 점 표기법 쿼리와 동일한 결과를 반환 할 것으로 예상됩니다. 내가 어디 틀렸어?



답변

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

이것은 headers 등가 { From: ... } 인 문서 , 즉 다른 필드를 포함하지 않는 문서를 쿼리 합니다.


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

headers.From포함되거나 누락 된 다른 필드의 영향을받지 않고 필드 만 확인 headers합니다.


점 표기법 문서


답변

두 개의 쿼리 메커니즘 은 하위 문서 섹션 의 문서 에서 제안한 것처럼 다른 방식으로 작동합니다 .

필드가 포함 된 문서 (즉, 보유하는 경우 하위 문서를 ), 당신도 전체 지정할 수 있습니다 하위 문서 은 “에 도달”는 필드의 값, 또는 하위 문서를 의 개별 필드에 대한 값을 지정하는 점 표기법을 사용하여 하위 문서를 :

하위 문서 내의 동일 항목 일치는 하위 문서가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치하는 경우 문서를 선택합니다.


다음 예제에서 쿼리는 필드 생산자 값이 값을 가진 필드 만 포함하는 하위 문서 인 모든 문서를 일치 company시킵니다.'ABC123' 하고 필드 address값으로 '123 Street'정확한 순서를 :

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});


답변

하위 문서로 MongoDB 수집 쿼리 에 대해 많은 혼란이 있기 때문에 위의 답변을 예제와 함께 설명하는 것이 .

먼저 컬렉션에 두 개의 객체 만 삽입했습니다 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()

이 값은 object 와 동일한 문서를 쿼리하므로 다른 필드 만 포함하지 않거나 전체 하위 문서를 필드 값으로 지정해야 하기 때문에 하나 여야합니다.headers{From: "reservations@marriott.com"}

그래서 @ Edmondo1984의 답변에 따라

하위 문서 내에서 동등 일치는 하위 문서 가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치 하는 경우 문서를 선택합니다 .

위의 진술에서 아래 쿼리 결과는 무엇입니까?

> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"}  }).count()
0

그리고 우리는의 순서를 변경 할 경우 FromTo두 번째 문서의 하위 문서로 같은 즉?

> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"}  }).count()
1

따라서 order 필드를 포함하여 지정된 하위 문서정확하게 일치 합니다 .

도트 연산자를 사용하면 모든 사람에게 매우 명확하다고 생각합니다. 아래 쿼리 결과를 보자.

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

위의 예제를 사용하여 이러한 설명을 통해 하위 문서로 찾기 쿼리를 보다 명확하게 수행 할 수 있기를 바랍니다 .


답변