2012-05-21 3 views
2

mongo에서 매우 기본적인 데이터 형식으로 복잡한 논리 쿼리를 작성하는 것에 대해 논쟁 중입니다. 사용자 속성의 본질적 나는 수백만을 가질 수 있도록 내 기본 몽고 문서입니다 : 내가하고 싶은 무엇간단한 몽고 문서에서 복잡한 논리가 울림

{ 
    name: "Gender" 
    value: "Male" 
    userId : "ABC123" 
} 

{ 
    name: "M-Spike" 
    value: 0.123 
    userId : "ABC123" 
} 

이 findall은 userId를 같은 것들에 대한 검색은 {이름 : "성별, 값 :"남성 "}와 {

집계 프레임 워크를 사용해 보았지만 쿼리의 복잡성은 제한되어 있습니다. 기본적으로 모든 조건을 ORing하고 sampleId로 결과를 계산했습니다. 이름 : "m-spike", 값 : {$ gt : 0.1} (기초적인 AND를 복제 한)

+0

2.1 버전과 새 집계 프레임 워크를 사용하고 있습니까? –

+0

예 그것을 사용하지만 실제로 내가 원하는 것을 정확하게 얻지는 못한다. @AsyaKamsky – nialloc

+0

각 사용자가 수천 가지의 속성을 가질 수 없다면, 나는 당신의 스키마 구조에 놀랐다. 나는 단일 사용자를위한 모든 속성을 갖는 것이 자연스러운 것이라고 생각한다. 하나의 문서에서 ... 사용자가 가질 속성의 모든 이름을 알고 있습니까? 이 –

답변

0

N은 쿼리하려는 속성의 수를 나타낼 수있는 방법을 볼 수 있습니다 (N은 사용자의 테스트에서 2가됩니다). 르). 이런 식으로 뭔가를 시도 :

db.collection.aggregate(
     [ { $match: {$or: [ 
         {"name":"M-Spike","value":{$gt:.1}}, 
         {"name":"Gender","value":"Male"} 
          ] 
        } 
     }, 
     { $group: { _id:"$userId",total:{$sum:1}} 
     }, 
     { $project: { _id:1, 
         matchedAttr : { $eq: ["$total",2] } 
        } 
     } 
     ] 
) 

당신은 다시 얻을 것이다 :

{ 
    "result" : [ 
     { 
      "_id" : "XYZ123", 
      "matchedAttr" : false 
     }, 
     { 
      "_id" : "ABC123", 
      "matchedAttr" : true 
     } 
    ], 
    "ok" : 1 
} 

을 지금, 당신은이 조건은 당신이 그들 모두를 일치 _id 다시 진정한 얻을 통해 일치 "$ 또는"이 있다면 . 따라서 5 가지 조건에 대해 $ 일치 : $ 또는 배열에는 5 개의 조건부 쌍이 있고 마지막 $ 프로젝트 변환은 $eq: ["$total",5]

이됩니다.이 솔루션에는 중복 항목을 가질 수 없다는 가정이 있습니다 (예 : _id에는 "M-Spike": .5 또한 "M-Spike": .2 할 수 있으면 작동하지 않습니다.

+0

그렇다. 지금까지 나는 이것과 거의 동일한 것을 가지고있다. 이것은 효과적으로 논리적 인 AND를 생성하며, OR과 함께이 작업을 수행하려는 경우 사실이라고 생각하지 않습니다. 예를 들어 OR (AND ("name": "M-Spike", "value": {$ gt : .1}}, { "name": "Gender", "value": "Male"}) name ":"KRAS ","value ": {$ gt : 12.4}}) – nialloc

+0

이런 스키마를 보았습니까? 합리적인 접근이라고 생각하십니까? – nialloc

+0

유연한 쿼리를위한 합리적인 스키마처럼 보이지 않습니다. 정확히 "or"쿼리는 어떻게 될 것입니까? 그것이 모든 속성 또는 모든 속성을 갖고 있다면? –