중첩 된 객체를 쿼리하는 방법?
중첩 된 객체 표기법으로 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()
이것은 객체와 동일한 문서를 쿼리하기 때문에 하나 여야합니다. 즉, 다른 필드 만 포함하지 않거나 전체 하위 문서를 필드 값으로 지정해야합니다.headers
{From: "reservations@marriott.com"}
그래서 @ Edmondo1984의 ans에 따라
하위 문서 내에서 동등 일치는 하위 문서 가 필드 순서를 포함하여 지정된 하위 문서와 정확히 일치 하는 경우 문서를 선택합니다 .
위의 문장에서 아래 쿼리 결과는 무엇입니까?
> 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
예를 들어이 설명이 하위 문서로 찾기 쿼리를 더 명확하게하기를 바랍니다 .
참고 URL : https://stackoverflow.com/questions/16002659/how-to-query-nested-objects
'Programing' 카테고리의 다른 글
(Java) 패키지 구성에 대한 모범 사례가 있습니까? (0) | 2020.05.15 |
---|---|
Xcode : 일반 언어로 된 목표와 체계는 무엇입니까? (0) | 2020.05.15 |
파이썬 코드에서 쉘 스크립트를 호출하는 방법은 무엇입니까? (0) | 2020.05.15 |
파이썬에서 [] 연산자를 재정의하는 방법은 무엇입니까? (0) | 2020.05.14 |
C #에서 CPU 사용량을 얻는 방법? (0) | 2020.05.14 |