计算文件并返回子集

时间:2018-07-30 05:00:01

标签: mongodb

有没有一种方法可以用于MongoDB聚合框架:

  1. 计算从$match返回的文档数
  2. 通过另一个$match
  3. 获取这些文档的子集

全部查询?我当时在想,可能有一种方法可以在管道中使用多个$group阶段来在附加的$match之前对文档进行计数,然后将结果传递给第二个$group。但是我还没有找到一种方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的,您需要$facet流水线阶段,该阶段可以执行多个子聚合。给定这样的数据:

db.col.save({ a: 1, b: 2 })
db.col.save({ a: 1, b: 2 })
db.col.save({ a: 1, b: 2 })
db.col.save({ a: 1, b: 4 })
db.col.save({ a: 3, b: 2 })

您可以使用以下汇总:

db.col.aggregate([
    {
        $match: { a: 1 }
    },
    {
        $facet: {
            total : [
                { $count: "count" }
            ],
            subset: [
                { $match: { b: 2 } },
                { $project: { _id: 0 } }
            ]
        }
    }
])

输出:

{ "total" : [ { "count" : 4 } ], "subset" : [ { "a" : 1, "b" : 2 }, { "a" : 1, "b" : 2 }, { "a" : 1, "b" : 2 } ] }

每个子聚合将作为数组返回,但是您可以在$unwind上应用下一个流水线阶段,例如count