对数组MongoDB中的所有文档使用$size
以下是我收藏的结构部分:对数组MongoDB中的所有文档使用$size,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,以下是我收藏的结构部分: _id: ObjectId("W"), names: [ { number: 1, list: ["A","B","C"] }, { number: 2, list: ["B"] }, { number: 3, list: ["A","C"] } ... ], ... 我使用此请求: db.publication.ag
_id: ObjectId("W"),
names: [
{
number: 1,
list: ["A","B","C"]
},
{
number: 2,
list: ["B"]
},
{
number: 3,
list: ["A","C"]
}
...
],
...
我使用此请求:
db.publication.aggregate( [ { $match: { _id: ObjectId("54a1de90453d224e80f5fc60") } }, { $group: { _id: "$_id", SizeName: { $first: { $size: { $ifNull: [ "$names", [] ] } } }, names: { $first: "$names" } } } ] );
但是我现在会在我的名称数组的每个文档中使用$size
是否可能获得此结果(其中“sizeList”是$size的结果):
这不一定是最有效的方法,但我认为它实现了您的目标:
db.publication.aggregate( [
{ $unwind: '$names' },
{ $unwind: '$names.list' },
{ $group: {
_id: { _id: "$_id", number: "$names.number" },
SizeList: { $sum: 1 },
list: { $push: "$names.list" }
}
},
{ $group: {
_id: "$_id._id",
names: {
$push: {
number: "$_id.number",
list: "$list",
SizeList: "$SizeList"
}
},
SizeName: {$sum: 1}
}
}
]);
这不一定是最有效的方法,但我认为它实现了您的目标:
db.publication.aggregate( [
{ $unwind: '$names' },
{ $unwind: '$names.list' },
{ $group: {
_id: { _id: "$_id", number: "$names.number" },
SizeList: { $sum: 1 },
list: { $push: "$names.list" }
}
},
{ $group: {
_id: "$_id._id",
names: {
$push: {
number: "$_id.number",
list: "$list",
SizeList: "$SizeList"
}
},
SizeName: {$sum: 1}
}
}
]);
这里真正需要的是一个stage,用于更改数组成员的内容:
db.names.aggregate([
{“$project”:{
“SizeName”:{“$size”:“$names”},
“名称”:{“$map”:{
“输入”:“$names”,
“as”:“el”,
“在”:{
“SizeList”:{“$size”:“$$el.list”},
“编号”:“$$el.number”,
“列表”:“$$el.list”
}
}}
}}
])
您可以交替使用
$unwind
进行处理,然后将其重新分组,但在使用MongoDB 2.6时,这有点冗长。这里真正需要的是一个阶段,用于更改数组成员的内容:
db.names.aggregate([
{“$project”:{
“SizeName”:{“$size”:“$names”},
“名称”:{“$map”:{
“输入”:“$names”,
“as”:“el”,
“在”:{
“SizeList”:{“$size”:“$$el.list”},
“编号”:“$$el.number”,
“列表”:“$$el.list”
}
}}
}}
])
您可以交替使用
$unwind
进行处理,然后将其重新分组,但在使用MongoDB 2.6的情况下,这有点冗长。您可能没有意识到OP在问题中提到的操作符是MongoDB 2.6和更高的功能,可以有效地报告阵列的大小。因此,不再需要仅仅为了计算元素而展开数组。是的,你的答案太棒了,Neil-Thanksy你可能没有意识到OP在他们的问题中提到的操作符是MongoDB 2.6和更高版本的功能,可以有效地报告数组的大小。因此,不再需要仅仅为了计算元素而展开数组。是的,你的答案太棒了,尼尔-谢谢