Пн go DB $ метод поиска полей в массивах вместо коллекций - PullRequest
1 голос
/ 07 марта 2020

У меня есть пользовательский документ со следующей структурой:

{
    "_id": {
      "$oid": "5e636c552b872f00178033bf"
    },
    "finance": {
      "expenditure": [
        {
          "status": true,
          "_id": {
            "$oid": "5e636d442b872f00178033d4"
          },
          "amount": {
            "$numberInt": "900"
          },
          "category": "Coffee"
        },
        {
          "status": true,
          "_id": {
            "$oid": "5e636d492b872f00178033d5"
          },
          "amount": {
            "$numberInt": "1000"
          },
          "category": "Coffee"
        },
        {
          "status": true,
          "_id": {
            "$oid": "5e636d532b872f00178033d6"
          },
          "amount": {
            "$numberInt": "3000"
          },
          "category": "Sport"
        },
        {
          "status": true,
          "_id": {
            "$oid": "5e636d572b872f00178033d7"
          },
          "amount": {
            "$numberInt": "1000"
          },
          "category": "Sport"
        },

      ],
      "customcategories": [
        {
          "budget": {
            "$numberInt": "200"
          },
          "_id": {
            "$oid": "5e636c552b872f00178033c7"
          },
          "title": "Sport"
        },
        {
          "budget": {
            "$numberInt": "100"
          },
          "_id": {
            "$oid": "5e636c552b872f00178033c8"
          },
          "title": "Coffee"
        }
      ]
    }
}

Моя команда prev ios - эта (вам не нужно обращать внимание на статус и текущую дату):

User.aggregate([
  {
    $match: {
      _id: req.user._id
    }
  },
  {
    $unwind: "$finance.expenditure"
  },
  {
    $match: {
      "finance.expenditure.status": true
    }
  },
  {
    $sort: {
      "finance.expenditure.currentdate": -1
    }
  },
  {
    $group: {
      _id: "$finance.expenditure.category",
      amount: {
        $sum: "$finance.expenditure.amount",

      }
    }
  },
  {
    $project: {
      _id: 0,
      category: "$_id",
      amount: 1
    }
  }
])

Результат выглядит следующим образом:

 {
    "expenditure": [
        {
            "amount": 1900,
            "category": "Coffee"
        },
        {
            "amount": 4000,
            "category": "Sport"
        }
    ]
}

Я хотел бы добавить мои сгруппированные элементы бюджет из соответствующей «пользовательской категории».

Чтобы это выглядело так:

{
        "expenditure": [
            {
                "amount": 1900,
                "category": "Coffee",
                "budget" : 100
            },
            {
                "amount": 4000,
                "category": "Sport",
                "budget" : 200

            }
        ]
    }

Я пробовал несколько вещей, но у меня ничего не работает с методом $lookup.

Я надеюсь, что некоторые могут помочь я:)

Ответы [ 2 ]

1 голос
/ 07 марта 2020

попробовать этот конвейер:

db.collection.aggregate([
    {
        $match: {  _id: ObjectId("5e636c552b872f00178033bf") }
    },
    {
        $unwind: "$finance.expenditure"
    },
    {
        $match: { "finance.expenditure.status": true }
    },
    {
        $sort: { "finance.expenditure.currentdate": -1 }
    },
    {
        $group: {
            _id: "$finance.expenditure.category",
            amount: { $sum: "$finance.expenditure.amount"},
            categories: { $first: '$finance.customcategories' }
        }
    },
    {
        $project: {
            _id: 0,
            category: "$_id",
            amount: 1,
            budget: {
                $arrayElemAt: [
                    {
                        $map: {
                            input: {
                                $filter: {
                                    input: '$categories',
                                    cond: { $eq: ['$$this.title', '$_id'] }
                                }
                            },
                            in: '$$this.budget'
                        }
                    },
                    0
                ]
            }
        }
    }
])

https://mongoplayground.net/p/adsWInz3wgY

0 голосов
/ 07 марта 2020

Попробуйте это:

User.aggregate([
  {
    $match: {
      _id: mongoose.Types.ObjectId(req.user._id)
    }
  },
  {
    $sort: {
      "finance.expenditure.currentdate": -1
    }
  },
  {
    $unwind: "$finance.expenditure"
  },
  {
    $unwind: "$finance.customcategories"
  },
  {
    $match: {
      "finance.expenditure.status": true
    }
  },
  {
    $group: {
      _id: "$finance.expenditure.category",
      amount: {
        $addToSet: "$finance.expenditure"
      },
      customcategories: {
        $addToSet: "$finance.customcategories"
      }
    }
  },
  {
    $project: {
      _id: 0,
      "amount": {
        $sum: "$amount.amount"
      },
      "category": "$_id",
      "budget": {
        $sum: {
          $let: {
            vars: {
              budget: {
                $filter: {
                  input: "$customcategories",
                  cond: {
                    $eq: [
                      "$_id",
                      "$$this.title"
                    ]
                  }
                }
              }
            },
            in: "$$budget.budget"
          }
        }
      }
    }
  }
])
//.exec(function(err, result){})

MongoPlayground

...