복붙노트

[MONGODB] MongoDB를 먼저 $

MONGODB

MongoDB를 먼저 $

나는 MongoDB의 쿼리와 같은이

// Get scoreboard of challenge
response.aggregate = await ScoreBoardModel.aggregate([
    { $match: { challenge_id: mongoose.Types.ObjectId(req.body.challenge_id) } },
    { $group: { _id: '$user_id', value: { $sum: '$value' } } },
]);

어떤 출력 등에

[
  {
    "_id": "5b762887b6e3a91c60c01718",
    "value": 4300
  },
  {
    "_id": "5b8b41f10186400163d0df83",
    "value": 6800
  },
  {
    "_id": "5b762590b6e3a91c60c01713",
    "value": 2023
  }
]

그러나 나는 다음과 같은이 쿼리의 일을 수행 할 :

response.aggregate = await ScoreBoardModel.aggregate([
    { $match: { challenge_id: mongoose.Types.ObjectId(req.body.challenge_id) } },
    { $lookup: {
        from: 'appusers',
        let: { 'user_id': '$user_id' },
        pipeline: [{ $match: { $expr: { $eq: [ '$_id', '$$user_id' ] } } },],
        as: 'user'
    } },
    { $group: { _id: '$user_id', value: { $sum: '$value' } } },
]);

나는 각 appusers의 세부 사항을 얻을 수 appusers에서 조회 $ 싶다. 어떻게 그렇게 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 $ 조별 리그를 적용한 후 첫 번째 문서를 반환 $ 첫째 집계 연산자를 사용합니다.

    당신은 $ 조별 리그를 적용한 후 첫 번째 문서를 반환 $ 첫째 집계 연산자를 사용합니다.

    ScoreBoardModel.aggregate([
      { "$match": { challenge_id: mongoose.Types.ObjectId(req.body.challenge_id) } },
      { "$lookup": {
        "from": "appusers",
        "let": { "user_id": "$user_id" },
        "pipeline": [{ "$match": { "$expr": { "$eq": [ "$_id", "$$user_id" ] } } }],
        "as": "user"
      }},
      { "$group": {
        "_id": "$user_id",
        "value": { "$sum": "$value" },
        "appusers": { "$first": "$user" },
      }}
    ])
    
  2. from https://stackoverflow.com/questions/52215916/first-in-mongodb by cc-by-sa and MIT license