2014-04-11 1 views
1

데이터베이스의 개체에는 다양한 개체를 저장할 수있는 '속성'배열이 있습니다. 그들 중 일부는 현재의 숫자 나 범위와 같이 :두 필드 사이에 숫자가 있는지 확인하는 mongodb 쿼리를 만드는 방법은 무엇입니까?

{'value': 10} 

또는

{'minValue': 4, 'maxValue': 8} 

X처럼, 나는 값 중 하나가 X를 같거나 어디 모든 문서를 찾으려면 특정 번호를 수집 쿼리 minValue < = X < = maxValue. 단점은 속성 배열이 MINVALUE 경우 MAXVALUE를 지정하는 여러 개체를 보유하고있는 경우, X는 이들의 사이가 될 수 있다는 것입니다
db.Pool0.find({$or: [{'properties.value': X}, {'properties.minValue': {$lte: X}, 'properties.maxValue': {$gte: X}}]}, {'_id': 1}).pretty() 

같은 쿼리 내 첫 번째 시도가 보인다. 예를 들어

"properties" : [ 
    { 
     "minValue" : 4, 
     "maxValue" : 6 
    }, 
    { 
     "minValue" : 10, 
     "maxValue" : 20 
    } 
] 

은 X = 8과 일치합니다. 속성 내의 개체 구조가 존중되도록 쿼리를 향상시킬 수 있습니까?

+0

당신이 콜렉션의 일부 문서를 게재 할 수 있습니까? – dikesh

답변

4

당신은 기본적으로이 형태의 $or 조건과 함께 $elemMatch를 사용하려면 : 속성에서 필드의 범위를 포함하는 문서뿐만 아니라 가능한 다른 키 이름을 충족 커버

db.collection.find({ 
    "$or": [ 
     { 
      "properties": { "$elemMatch": { 
       "minValue": { "$lte": 8 }, 
       "maxValue": { "$gte": 8 } 
      }} 
     }, 
     { 
      "properties.value": 8 
     } 
    ] 
}) 

.

그러나 일치하는 문서는 배열의 일치하는 요소와 다릅니다. 그냥 반환 할 일치하는 배열 요소를 기대하고 둘 이상이있는 경우 그래서, 당신은 집계 양식을 사용 :

db.collection.aggregate([ 
    // Matching documents is still good practice 
    { "$match": { 
     "$or": [ 
      { 
       "properties": { "$elemMatch": { 
        "minValue": { "$lte": 8 }, 
        "maxValue": { "$gte": 8 } 
       }} 
      }, 
      { 
       "properties.value": 8 
      } 
     ] 
    }}, 

    // Unwind to de-normalize 
    { "$unwind": "$properties" }, 

    // Then match to filter the elements 
    { "$match": { 
     "$or": [ 
      { 
       "properties.minValue": { "$lte": 8 }, 
       "properties.maxValue": { "$gte": 8 } 
      }, 
      { "properties.value": 8 } 
     ] 
    }}, 

    // Reconstruct the filtered array 
    { "$group": { 
     "_id": "$_id", 
     "properties": { "$push": "$properties" } 
    }} 
]) 

그러나 단지 당신이 단순히 사용의 확신 하나의 일치가 될 경우 찾기와 프로젝션 :

db.collection.find(
    { 
     "$or": [ 
      { 
       "properties": { "$elemMatch": { 
        "minValue": { "$lte": 8 }, 
        "maxValue": { "$gte": 8 } 
       }} 
      }, 
      { 
      "properties.value": 8 
      } 
     ] 
    }, 
    { "properties.$": 1 } 
) 
관련 문제