首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用聚合芒果的相同goods_info.name减去2个子文档

如何用聚合芒果的相同goods_info.name减去2个子文档
EN

Stack Overflow用户
提问于 2020-07-26 02:23:11
回答 2查看 58关注 0票数 0

我试图用相同的goods_in和goods_out减去goods_info.name。我试过了,还在坚持,请帮帮我

代码语言:javascript
复制
[
    {
        "_id": "5f1aaa902f90f940a40546fe",
        "goods_in": [
            {
                "goods_info": {
                    "name": "taro"
                },
                "quantity": 100
            },
            {
                "goods_info": {
                    "name": "granita"
                },
                "quantity": 17
            }
        ],
        "goods_out": [
            {
                "goods_info": {
                    "name": "taro"
                },
                "quantity": 25
            },
            {
                "goods_info": {
                    "name": "taro"
                },
                "quantity": 15
            },
        ]
    }
]

期望产出:

代码语言:javascript
复制
[{"name":"taro","quantity":60},{"name":"granita","quantity":17}]

有什么帮助吗。我试过小组等

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-26 09:47:01

您可以使用此聚合,如果goods_ids可以在多个文档之间存在重复,则必须添加一个$group阶段,否则就会得到dup结果。

代码语言:javascript
复制
db.collection.aggregate([
  {
    $unwind: "$goods_in"
  },
  {
    $project: {
      name: "$name",
      quantity: {
        $subtract: [
          "$goods_in.quantity",
          {
            $sum: {
              $map: {
                input: {
                  $filter: {
                    input: "$goods_out",
                    as: "good",
                    cond: {
                      $eq: [
                        "$$good.goods_info.name",
                        "$goods_in.goods_info.name"
                      ]
                    }
                  }
                },
                as: "item",
                in: "$$item.quantity"
              }
            }
          }
        ]
      }
    }
  }
])

MongoPlayground

票数 0
EN

Stack Overflow用户

发布于 2020-07-26 10:57:59

通过aggregationgroup,您可以处理它,通过组阶段您可以在out_value变量中推入out数量之和,然后在lookup同名的字段上用第一个集合加入结果。在聚合结束时,您可以减去in_valueout_value

代码语言:javascript
复制
db.collection.aggregate(
    [
        {
            "$unwind": "$goods_out"
        },
        {
            "$group": {
                "$_id": "goods_out.name", "out_value": {"$sum": "good_out.quantity"}
            }
        },
        {
            "$lookup": {
                "from": "collection_name",
                "let": {"name": "$_id", "out_value": "$out_value", "in_value": "$goods_in.quantity"},
            "pipeline": [
                {
                  "$unwind": "$goods_in"
                },
                {
                    "$match": {

                    "$expr":
                        {"$eq": ["$$goods_in.name", "$_id"]}
                }}
            ],
            "as": "goods_info"
            }
        },
        {
            "$unwind": "$goods_info"
        },
        {
            "$project":{
                "name": "$goods_info.name",
                "quantity": {
                    "$subtract": ["$goods_info.in_value", "$goods_info.in_value"]
                }
            }
        }

    ]
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63095476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档