MongoDB 添加以变量值命名的新字段

标签 mongodb nosql aggregation-framework

我的问题是,像这样的文档很少

{
  deliveryDay: "2021-01-14",
  plate: {
    name: "pasta",
    quantity: 1
  }
}

{
  deliveryDay: "2021-01-16",
  plate: {
    name: "pasta",
    quantity: 3
  }
}

{
  deliveryDay: "2021-01-16",
  plate: {
    name: "pizza",
    quantity: 2
  }
}


有办法获得下面想要的结果吗?我尝试使用 $addFields 自定义命名字段,如下 {"$deliveryDay": "$plate.quantity"} 但给出了无效错误。聚合不是一个问题,而且我在聚合框架中,所以我需要使用聚合管道阶段来完成它。

出席结果:

{
  "2021-01-14": 1,
  "2021-01-16": 3,
  plate: {
    name: "pasta"
  }
}

{
  "2021-01-14": 0,
  "2021-01-16": 2,
  plate: {
    name: "pizza"
  }
}

最佳答案

所以想法是:

  1. deliveryDayplate.name 对文档进行分组,以获得 plate.quantity 的总和。
  2. 将上述结果再次按name分组,生成[{ k: "", v: ""}]格式的数组。
  3. { k: "plate", v: { name: "$_id"} } 连接到上面的数组中。
  4. 现在使用 $arrayToObject数组转换为对象.

Solution in Mongo playground 。试试这个:

db.testCollection.aggregate([
    {
        $group: {
            _id: {
                dDate: "$deliveryDay",
                name: "$plate.name"
            },
            sumOfQty: { $sum: "$plate.quantity" }
        }
    },
    {
        $group: {
            _id: "$_id.name",
            array: {
                $push: {
                    k: "$_id.dDate",
                    v: "$sumOfQty"
                }
            }
        }
    },
    {
        $addFields: {
            array: {
                $concatArrays: ["$array", [{ k: "plate", v: { name: "$_id" } }]]
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$array" }
        }
    }
]);

输出

/* 1 */
{
    "2021-01-16" : 2,
    "plate" : {
        "name" : "pizza"
    }
},

/* 2 */
{
    "2021-01-14" : 1,
    "2021-01-16" : 3,
    "plate" : {
        "name" : "pasta"
    }
}

关于MongoDB 添加以变量值命名的新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66860506/

相关文章:

php - 在插入 MySQL 之前临时存储数据

node.js - 如何使用 $filter(aggregation) 仅在条件为 true 时选择数组的某些字段?

mongodb - MeteorD中的MongoDB URL

java - com.google.code.morphia :morphia:jar:1. 00-SNAPSHOT 的 POM 丢失,没有可用的依赖信息

mysql - 用于链接图的 NoSQL 或 SQL

MongoDB 聚合计算小时范围内的产品数量

mongodb - 使用 mongo 查找某人在未来 30 天内是否过生日

mongodb - 从PIG写入MongoDB-错误2116-未找到mongodb模式

node.js - 使用案例在 mongodb 中查找查询

c# - MongoDB 中的子对象