gpt4 book ai didi

MongoDB:使用数组字段的项目

转载 作者:可可西里 更新时间:2023-11-01 09:12:20 24 4
gpt4 key购买 nike

我有一个这样的集合:每个文档都包含 Message 字段,该字段又包含 Fields 数组。 Fields 数组下的每个文档都有 ValueName 属性。

[
{
"_id" : ObjectId("55711efed0103b1598140076"),
"Message" : {
"Fields" : [
{
"Value" : 131,
"Name" : "Options",
},
{
"Value" : 8,
"Name" : "Length",
}
]
}
},

{
"_id" : ObjectId("55711efed0103b1598140077"),
"Message" : {
"Fields" : [
{
"Value" : 65,
"Name" : "Options",
},
{
"Value" : 13,
"Name" : "Length",
},
{
"Value" : 101,
"Name" : "Width",
}
]
}
}
]

在使用 db.Collection.find({}) 查找文档后,我想这样投影 - 它解析 Message.Fields 下的每个 Field 并将它们投影到新文档中,使用 Type 作为属性名称,使用 Value 作为值。输出如下所示:

[
{
"_id" : ObjectId("55711efed0103b1598140076"),
"Options" : 131,
"Length" : 8
},
{
"_id" : ObjectId("55711efed0103b1598140077"),
"Options" : 65,
"Length" : 13,
"Width" : 101
},
]

这是否可以使用 function()aggregate 或 MongoDB 中的任何其他方式实现?

最佳答案

您可以使用 aggregation$cond运算符

db.collection.aggregate(
[
{ $unwind: "$Message.Fields" },
{ $project: { fields: "$Message.Fields" }},
{ $project:
{
Option:
{
$cond: [{ $eq: [ "$fields.Name", "Options" ]}, "$fields.Value", 0 ]
},
Length:
{
$cond: [{ $eq: [ "$fields.Name", "Length" ]}, "$fields.Value", 0 ]
},
Width:
{
$cond: [{ $eq: [ "$fields.Name", "Width" ]}, "$fields.Value", 0]
}
}
},
{ $group: {
_id: "$_id",
Options: { $sum: "$Option" },
Width: { $sum: "$Width" },
Length: { $sum: "$Length" }
}
}
]
)

结果:

{
"_id" : ObjectId("55711efed0103b1598140077"),
"Options" : 65,
"Width" : 101,
"Length" : 13
}
{
"_id" : ObjectId("55711efed0103b1598140076"),
"Options" : 131,
"Width" : 0,
"Length" : 8
}

关于MongoDB:使用数组字段的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30658545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com