2016-06-30 2 views
-1

MongoDB의 쿼리에 $ 프로젝트 운영자와 필드를 포함 할 수 없습니다 : 나는 쿼리 만든내가 다음과 같습니다 test라는 모음이 내 MongoDB를 데이터베이스에서

{ 
    "_id" : ObjectId("5774f2807f93c094a6691506"), 
    "name" : "jack", 
    "city" : "LA", 
    "age" : 30.0, 
    "cars" : 0 
} 

{ 
    "_id" : ObjectId("5774f2be7f93c094a6691507"), 
    "name" : "jack", 
    "city" : "LA", 
    "age" : 40.0, 
    "cars" : 0 
} 

{ 
    "_id" : ObjectId("5774f2ed7f93c094a6691508"), 
    "name" : "peter", 
    "city" : "London", 
    "age" : 35.0, 
    "cars" : 1 
} 

을하는 그룹의 사람들을 이름으로 각 그룹의 가장 오래된 요소 만 표시합니다. 더하여 그것은 적어도 차를 가지고있는 녀석을 표시한다. 쿼리는 다음과 같습니다

db.getCollection('test').aggregate([ 

       { 
        "$match":{"cars":{$ne:0}} 
       }, 
       { 
        "$group": { "_id": { name: "$name", city: "$city" }, "age":{$max:"$age"}} 
       } 
       , 
       { 
        "$project":{"age":1, "name":"$_id.name", "city":"$_id.city", "cars":true} 
       } 
     ]) 

을 나는 다음과 같은 결과를 얻을 수 위의 쿼리를 실행 한 후 :

{ 
    "_id" : { 
     "name" : "peter", 
     "city" : "London" 
    }, 
    "age" : 35.0, 
    "name" : "peter", 
    "city" : "London" 
} 

피터는 자동차를 소유하고있는 유일한 사람이기 때문 맞습니다. 문제는 "cars"필드가 표시되지 않는다는 것입니다. 쿼리에서 볼 수 있듯이 $ project 연산자가 있으며 "cars"필드는 true로 설정됩니다. 그래서 그것은 표시되어야합니다.

답변

0

하나의 솔루션은 데이터를 그룹화하는 동안 자동차를 어레이에 "밀어 넣는"것일 수 있습니다.

db.getCollection('test').aggregate([ 

       { 
        "$match":{"cars":{$ne:0}} 
       }, 
       { 
        "$group": { "_id": { name: "$name", city: "$city" }, 
             cars : {$push : "$cars"}, "age":{$max:"$age"}} 
       } 
       , 
       { 
        "$project":{"age":1, "name":"$_id.name", "city":"$_id.city", "cars":true} 
       } 
     ]) 
0

그룹화 단계에서 자동차를 추가하는 것이 도움이됩니까? 나는 당신이 그들을 셀 수 있다고 가정하고 있습니다.

"$group": { 
    "_id": { name: "$name", city: "$city" }, 
    "age": { $max:"$age" } 
    "cars": { $sum:"$cars" } 
} 

입력 단계는 그룹화 단계의 출력입니다. 원래 쿼리에서이 입력에 사용할 수있는 자동차 필드가 없었습니다.

0

이전 파이프 라인 단계에서 생성되지 않았기 때문에 표시되지 않습니다. 집계 파이프 라인이 어떻게 작동하는지 이해하려면 데이터베이스 시스템에서와 마찬가지로 집계 작업을 처리하십시오.

$group 파이프 라인 연산자는 SQL의 GROUP BY 절과 유사합니다. SQL에서는 집계 함수를 사용하지 않으면 GROUP BY을 사용할 수 없습니다.

마찬가지로, MongoDB에서도 집계 함수를 사용해야합니다. 이 경우 자동차 필드를 생성하려면 $first 연산자를 사용하여 그룹의 최상위 문서 필드를 반환해야합니다.

$group 파이프 라인 단계에 들어가기 문서가, 순서에 대한 $group 전에 $sort 파이프 라인에 따라서 필요성을 정렬 할 때 잘 작동

. 그런 다음 $first 연산자를 주문한 그룹에 적용하여 최대 값 (기본적으로 주문한 그룹의 최상위 문서이며 해당 자동차 값 포함)을 얻을 수 있습니다.

원하는 필드는 다음과 같이 보일 것이다 반환하는 올바른 파이프 라인 :

db.test.aggregate([ 
    { "$match": { "cars": { "$ne": 0 } } }, 
    { "$sort": { "name": 1, "city": 1, "age": -1 } } 
    { 
     "$group": { 
      "_id": { "name": "$name", "city": "$city" }, 
      "age": { "$first": "$age" } , 
      "cars": { "$first": "$cars" } 
     } 
    }, 
    { 
     "$project": { 
      "age": 1, 
      "cars": 1, 
      "_id": 0, 
      "name": "$_id.name", 
      "city": "$_id.city"    
     } 
    } 
]) 
+0

당신은'$의 match' 표현에서'$의 gt'를 사용해야합니다. – styvane

관련 문제