MongoDB 添加以变量值命名的新字段
MongoDB add new fields named with variable value
我的问题是,像这样的文档很少
{
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"
}
}
所以想法是:
- 将文档按
deliveryDay
和 plate.name
分组以获得 plate.quantity
的总和。
- 将以上结果再次按
name
分组生成[{ k: "", v: "" }]
格式的数组。
- 将
{ k: "plate", v: { name: "$_id" } }
连接到上面的数组中。
- 现在使用 $arrayToObject 将
array
转换为对象。
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"
}
}
我的问题是,像这样的文档很少
{
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"
}
}
所以想法是:
- 将文档按
deliveryDay
和plate.name
分组以获得plate.quantity
的总和。 - 将以上结果再次按
name
分组生成[{ k: "", v: "" }]
格式的数组。 - 将
{ k: "plate", v: { name: "$_id" } }
连接到上面的数组中。 - 现在使用 $arrayToObject 将
array
转换为对象。
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"
}
}