如何在算术聚合表达式期间访问文档总数
How to access overall document count during arithmetic aggregation expression
我有 collection 份这种格式的文件:
{
_id: ObjectId,
items: [
{
defindex: number,
...
},
...
]
}
架构中不相关的某些部分将被省略,项目数组中的每个项目 defindex 保证运行对于该数组是唯一的。相同的 defindex 可以出现在不同文档的 items
字段中,但如果存在,则只会在每个相应的数组中出现一次。
我目前在 items
字段上调用 $unwind,然后在 items.defindex
上调用 $sortByCount 到获取计数最高的项目的排序列表。
我现在想使用 $set 添加一个名为 usage
的新字段到这个最终排序列表,它显示项目的使用量占初始数量的百分比collection 中的文档总数。
(即,如果项目的 count
是 1300,并且 $unwind 之前的总文档计数是 2600,则使用值将为 0.5)
我最初的计划是在最初的 collection 上使用 $facet,这样创建一个文档:
{
total: number (achieved using $count),
documents: [{...}] (achieved using an empty $set)
}
然后在文档字段上调用 $unwind 以将文档总数添加到每个文档中。使用 $set 计算使用值就很简单了,因为总计数是文档本身的一个字段。
这种方法 运行 解决了内存问题,因为我的 collection 远远大于 16MB 的限制。
我该如何解决这个问题?
一种方法是使用 $setWindowFields
:
db.collection.aggregate([
{
$setWindowFields: {
output: {
totalCount: {$count: {}}
}
}
},
{
$unwind: "$items"
},
{
$group: {
_id: "$items.defindex",
count: {$sum: 1},
totalCount: {$first: "$totalCount"}
}
},
{
$project: {
count: 1,
usage: {$divide: ["$count", "$totalCount"]
}
}
},
{$sort: {count: -1}}
])
如你所见here
我有 collection 份这种格式的文件:
{
_id: ObjectId,
items: [
{
defindex: number,
...
},
...
]
}
架构中不相关的某些部分将被省略,项目数组中的每个项目 defindex 保证运行对于该数组是唯一的。相同的 defindex 可以出现在不同文档的 items
字段中,但如果存在,则只会在每个相应的数组中出现一次。
我目前在 items
字段上调用 $unwind,然后在 items.defindex
上调用 $sortByCount 到获取计数最高的项目的排序列表。
我现在想使用 $set 添加一个名为 usage
的新字段到这个最终排序列表,它显示项目的使用量占初始数量的百分比collection 中的文档总数。
(即,如果项目的 count
是 1300,并且 $unwind 之前的总文档计数是 2600,则使用值将为 0.5)
我最初的计划是在最初的 collection 上使用 $facet,这样创建一个文档:
{
total: number (achieved using $count),
documents: [{...}] (achieved using an empty $set)
}
然后在文档字段上调用 $unwind 以将文档总数添加到每个文档中。使用 $set 计算使用值就很简单了,因为总计数是文档本身的一个字段。
这种方法 运行 解决了内存问题,因为我的 collection 远远大于 16MB 的限制。
我该如何解决这个问题?
一种方法是使用 $setWindowFields
:
db.collection.aggregate([
{
$setWindowFields: {
output: {
totalCount: {$count: {}}
}
}
},
{
$unwind: "$items"
},
{
$group: {
_id: "$items.defindex",
count: {$sum: 1},
totalCount: {$first: "$totalCount"}
}
},
{
$project: {
count: 1,
usage: {$divide: ["$count", "$totalCount"]
}
}
},
{$sort: {count: -1}}
])
如你所见here