2015-01-13 5 views
11

은 가정하자이 같은 모음이 있습니다몽고 쿼리

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] }, 
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] } 

을 내가 arr있어 모든 문서 찾으려는 name = "B"와 num와 하위 문서를 포함 = 2

나는이 같은 쿼리 할 경우 그들은 각각 스와 포함되어 있기 때문에

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

이 컬렉션에있는 모든 문서를 반환됩니다 와 B-문서 중 하나 "B"의 name 또는 나는 또한이 시도했습니다 2.

num : 오류가 발생하지 않습니다

db.collection.find({ 
    arr: [ 
     { "name": "b", "num": 2 } 
    ] 
}); 

는, 아직 결과를 반환하지 않습니다 .

MongoDB의 여러 하위 문서 필드를 어떻게 쿼리합니까?

답변

22

종종 이것은 오용되는 경우가 많지만 실제로는 $elemMatch 연산자입니다. 기본적으로 배열 내부의 각 요소에 대해 쿼리 조건을 수행합니다. 명시 적으로 호출하지 않는 한 모든 MongoDB의 인수는 "및"작업입니다 만 일치하는 필드와 그되지 를 기대하는 경우

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } }) 

당신은 아마 또한뿐만 아니라 여기에 "프로젝트"원하는 전체 문서 :

두 번째 시도가,이 쿼리를 작동하지 않는 이유 마지막으로

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2 } } }, 
    { "arr.$": 1 } 
) 
설명합니다 :

db.collection.find({ 
    "arr": [ 
     { "name": "b", "num": 2 } 
    ] 
}) 

실제 할 일이 없기 때문에 아무것도 일치하지 않습니다 cument "arr"에는 조건에 정확히 일치하는 단수 요소가 들어 있습니다.

첫 번째 예는 실패 .. 다음 조건을 만족하고이 단지 두 조건이 동일한 요소에 적용하는 것이 고려되지 여러 배열 요소가

db.collection.find({ 
    $and: [ 
     { "arr.name": "b" }, 
     { "arr.num": 2 } 
    ] 
}); 

때문에. 즉, $elemMatch이 추가되며 일치해야 할 조건이 하나 이상 필요한 경우 여기에서이 값을 사용합니다.

+1

매우 유용하고 완전한 대답입니다. 두 번 upvote 할 수없는 것에 유감입니다. 네일 고마워! – Moppo