중첩 된 객체 표기법으로 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
그리고 우리는의 순서를 변경 할 경우 From
와 To
두 번째 문서의 하위 문서로 같은 즉?
> 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
위의 예제를 사용하여 이러한 설명을 통해 하위 문서로 찾기 쿼리를 보다 명확하게 수행 할 수 있기를 바랍니다 .