对数组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和更高版本的功能,可以有效地报告数组的大小。因此,不再需要仅仅为了计算元素而展开数组。是的,你的答案太棒了,尼尔-谢谢