如何在算术聚合表达式期间访问文档总数

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