【问题标题】:Mongo DB $look up Method for Fields in Arrays instead of CollectionsMongodb $lookup 方法用于数组而不是集合中的字段
【发布时间】:2020-03-07 10:43:56
【问题描述】:

我有一个具有以下结构的用户文档:

{
    "_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"
        }
      ]
    }
}

我的 previos 命令是这个(你不必介意状态和当前日期):

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"
        }
    ]
}

我想将我的分组元素添加到相关“customcategory”中的预算中。

所以它看起来像这样:

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

            }
        ]
    }

我尝试了几件事,但 $lookup 方法对我不起作用。

希望有人能帮到我:)

【问题讨论】:

    标签: database mongodb aggregation-framework backend mongo-shell


    【解决方案1】:

    试试这个管道:

    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

    【讨论】:

      【解决方案2】:

      试试这个:

      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

      【讨论】:

      • 感谢它有效,但不幸的是,支出金额是自定义类别数组长度的 x 倍。你能再帮我一次吗?
      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多