sourcetip

mongodb - 검색 후 집약하는 방법

fileupload 2023. 3. 29. 21:46
반응형

mongodb - 검색 후 집약하는 방법

아래 스키마의 문서를 포함하는 컬렉션이 있습니다.성별이 포함된 모든 문서를 필터링/검색하여 브레인코어의 합계를 집계하고 싶습니다.아래 문구를 시도해보니 잘못된 파이프라인 오류가 나타납니다.

db['!all'].aggregate({ $and: [ {'GENDER' :  'F'} , {'DOB' : { $gte : 19400801, $lte : 20131231 }} ]  }, { $group : { _id : "$GENDER", totalscore : { $sum : "$BRAINSCORE" } } } )

스키마:

{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a1a9"),
    "DOB" : 19690112,
    "GENDER" : "F",
    "BRAINSCORE" : 65
},
{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a1a2"),
    "DOB" : 19950116,
    "GENDER" : "F",
    "BRAINSCORE" : 44
},
{
    "_id" : ObjectId("53f63fc8f2b643f6ebb8a902"),
    "DOB" : 19430216,
    "GENDER" : "M",
    "BRAINSCORE" : 71
}

$match를 사용해야 합니다.

db['!all'].aggregate([
  {$match:
    {'GENDER': 'F',
     'DOB':
      { $gte: 19400801,
        $lte: 20131231 } } },
  {$group:
     {_id: "$GENDER",
     totalscore:{ $sum: "$BRAINSCORE"}}}
])

출력:

{ "_id" : "F", "totalscore" : 109 }

작업 쿼리 예시:

db.getCollection('NOTIF_EVENT_RESULT').aggregate([
{$match:
    {'userId': {'$in' : ['user-900', 'user-1546']},
    'criteria.operator': 'greater than', 'criteria.thresold' : '90', 'category' : 'capacity'}
},
{"$group" :  {_id : {userId:"$userId"}, "count" : { "$sum" : 1} } }
])

DOB 번호를 날짜로 변환하여 비교해야 하는 경우의 답변은 다음과 같습니다.그렇지 않은 경우 1970 등의 숫자 또는 날짜는 $gte에서 $19400801로 잘못 표시됩니다(시도 가능).

db['!all'].aggregate([
    {
        $addFields: {
            "_temp_DOB": {
                $dateFromString: {
                    dateString: {$toString: {$toLong: "$DOB"}},
                    format: "%Y%m%d"
                }
            }
        }   
    },
    {
        $match: {
            'GENDER': 'F', 
            '_temp_DOB': { $gte: new Date("1940-08-01"),  
                           $lte: new Date("2013-12-31") }
        }
    },
    {
        $group: {
            _id: "$GENDER", 
            totalscore: { $sum: "$BRAINSCORE" }
        }
    }
])

출력:

{ "_id" : "F", "totalscore" : 109 }

엔리케의 대답 외에

사용자 ID(mongoose 오브젝트)를 사용하여 집약하는 경우ID) 쿼리 ID(문자열 유형)를 mongoose 객체에 캐스트해야 합니다.아이디:

const userId = mongoose.Types.ObjectId(user_id). 

또 다른,$match빈 어레이가 반환됩니다.

언급URL : https://stackoverflow.com/questions/25436630/mongodb-how-to-find-and-then-aggregate

반응형