2015-01-22 4 views
1

노드 js를 사용하여 mongodb 쿼리를 실행하는 데 node-mongodb-native을 사용하고 있습니다. 필드를 다음 한 콜렉션 이름 '위치'가있다 :MongoDB 컬렉션의 다양한 필드에서의 고유 값

sublocality1, sublocality2, sublocality3, city는.

이 필드에서 전체 고유 값을 가져 오려고합니다.

예 :

{ 
    'sublocality1':'a', 
    'sublocality2':'a', 
    'sublocality3': 'b', 
    'city': 'c' 
} 

{ 
    'sublocality1':'b', 
    'sublocality2':'a', 
    'sublocality3': 'b', 
    'city': 'a' 
} 

쿼리 내가 다음 시도

['a' , 'b', 'c'] 

를 반환해야합니다 : 문서

Run distinct queries for each of the fields: 
collection.distinct('sublocality1',..){}, 
collection.distinct('sublocality2',..){}, 
collection.distinct('sublocality3',..){}, 
collection.distinct('city',..){} 

이 목록에 이러한 쿼리의 결과를 삽입 및 검색 목록에있는 별개 항목의 경우

이것을 최적화 할 수 있습니까? 단일 쿼리를 실행할 수 있습니까?

답변

2

당신은 아래의 데이터베이스 서버에 집계 수 :

  • Group 개별 문서를 배열의 각 구성 필드 의 값을 얻을 수 있습니다.
  • Project$setUnion 연산자를 사용하여 모든 필드의 값의 union이라는 필드가 values 인 필드.
  • Unwind 값.
  • Group 모든 레코드는 고유 값을 가져옵니다.

코드 :

Collection.aggregate([ 
{$group:{"_id":"$_id", 
     "sublocality1":{$push:"$sublocality1"}, 
     "sublocality2":{$push:"$sublocality2"}, 
     "sublocality3":{$push:"$sublocality3"}, 
     "city":{$push:"$city"}}}, 
{$project:{"values":{$setUnion:["$sublocality1", 
           "$sublocality2", 
           "$sublocality3", 
           "$city"]}}}, 
{$unwind:"$values"}, 
{$group:{"_id":null,"distinct":{$addToSet:"$values"}}}, 
{$project:{"distinct":1,"_id":0}} 
],function(err,resp){ 
    // handle response 
}) 

샘플 오/p를 : 당신이 결과를 정렬하려면

{ "distinct" : [ "c", "a", "b" ] } 

, 당신은 마지막 project 단계 전에 파이프 라인에 sort 단계를 적용 할 수 .

+0

감사합니다. BatScream. 그러나 어떤 이유로 반환하는 빈 배열 :'collection.aggregate ( {$ group : { "_ id": "$ _ id", "subLocality1": {$ push : "$ address_components.subLocality1"} , "subLocality2": {$ push : "$ address_components.subLocality2"}, "subLocality3": {$ push : "$ address_components.subLocality3"}, "도시": {$ push : "$ address_components.city" }}}, {$ project_ {values} : {$ setUnion : [ "$ address_components.subLocality1", "$ address_components.subLocality2", ' –

+0

' "$ address_components.subLocality3", "$ address_components.{$ group : { "_ id": null, "distinct": {$ addToSet : "$ values"}}}, {$ project} "{$ unwind :"$ values ​​"}, {$ group} : –

+0

space 제약 조건을 위해 코드를 두 개의 주석 상자로 나누었습니다. subLoclity1, subLocality2 등은 중첩 된 문서입니다. ' "address_components": { "도시": "하이데라바드" "subLocality1": "Khairatabad" "subLocality2": "", "subLocality3": "", }', –