2016-07-15 3 views
2

오브젝트 배열을 포함하는 콜렉션이 있습니다. 나는 하나의 객체를 매개 변수로 사용하여 검색하기 위해 $elemMatch을 사용하는 방법을 알고 있지만 배열의 여러 객체의 값을 사용하는 방법이 필요합니다.Mongo 콜렉션에서 오브젝트 배열 검색

시료 채취 : 나는 다음 조건 중 하나와 일치하는 모든 기록과 일치하는 검색 조건을 지정하려면 어떻게

{ '_id' : ObjectId('5788804292a1c428cd5377ff'), 'index' : 'a', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_b' }, { 'value2' : 'data_c' } ] } 
{ '_id' : ObjectId('5788804b92a1c428cd537800'), 'index' : 'b', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_x' }, { 'value2' : 'data_c' } ] } 
{ '_id' : ObjectId('5788805592a1c428cd537801'), 'index' : 'c', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_x' }, { 'value2' : 'data_y' } ] } 

:

  1. value1 == data_bvalue2 == data_c
  2. value1 == data_xvalue2 == data_y
,210

는 내가 find와 함께 다음과 같은 시도했지만 결과가 반환되지 않습니다 :

{'data': {$elemMatch: {$in: [{'value1': 'data_b', 'value2': 'data_c'}, {'value1':'data_x', 'value2': 'data_y'}]}}} 

답변

1

당신이 일치하려는 경우 :

({value1: data_b} AND {value2: data_c}) OR ({value1: data_x} AND {value2: data_y}) 

위의 논리를 직접 번역 한이 쿼리를 사용할 수 있습니다.

귀하의 예제에서 두 문서 반환해야
db.collection.find(
    {$or: [ 
     {'data.value1': 'data_b', 'data.value2': 'data_c'}, 
     {'data.value1': 'data_x', 'data.value2': 'data_y'} 
    ]} 
) 

: 최상위 $or 연산자를 사용하여 쿼리

{ 
    "_id": ObjectId("5788804292a1c428cd5377ff"), 
    "index": "a", 
    "data": [ 
    { 
     "value0": "data_a" 
    }, 
    { 
     "value1": "data_b" 
    }, 
    { 
     "value2": "data_c" 
    } 
    ] 
} 
{ 
    "_id": ObjectId("5788805592a1c428cd537801"), 
    "index": "c", 
    "data": [ 
    { 
     "value0": "data_a" 
    }, 
    { 
     "value1": "data_x" 
    }, 
    { 
     "value2": "data_y" 
    } 
    ] 
} 

은 참고 $or 운영자의 모든 조건은 인덱스이 있어야합니다. 그렇지 않으면 MongoDB가 성능 문제가되고 작업 세트를 메모리에서 이동할 수있는 콜렉션 스캔을 수행합니다.

자세한 내용은 https://docs.mongodb.com/manual/reference/operator/query/or/#op._S_or을 참조하십시오.

+1

그래, 그게 효과가있어. 당신의 응답을 주셔서 감사합니다. 귀하의 응답에 따라'$ or'와'$ and'를'$ elemMatch'와 함께 배열에 사용하게되었습니다. (실제 객체는 훨씬 더 복잡하고 위의 콜렉션은 단순화 된 예제입니다). – schaazzz

0

{'data': {$all: [{'value1': 'data_b', 'value2': 'data_c'}, {'value1':'data_x', 'value2': 'data_y '}]}}

사용 $ 모든

+0

답변 해 주셔서 감사합니다.하지만 그것이 정확하다고 생각하지 않습니다. AFAIK, $ all은 배열의 모든 요소를 ​​지정된 필드와 비교합니다. 필자의 경우 필드 (즉,'data')는 객체의 값을 사용하여 검색하고자하는 객체의 배열입니다. – schaazzz