假设我有一个名为“上岗”集合(它实际上是一个更复杂的集合,职位过于简单)结构如下:
> db.posts.find()
{ "id" : ObjectId("50ad8d451d41c8fc58000003"), "title" : "Lorem ipsum", "author" :
"John Doe", "content" : "This is the content", "tags" : [ "SOME", "RANDOM", "TAGS" ] }
我希望这个集合要跨越数十万甚至数百万个,我需要通过标记查询帖子并按标记对结果进行分组并显示分页结果。这就是聚合框架进来我打算使用的骨料()方法来查询集合:
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
);
美中不足的是,创建分页程序,我需要知道输出数组的长度。我知道要做到这一点,你可以这样做:
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
{ "group" : {
_id: null,
total: { $sum: 1 }
} }
);
但是,这将丢弃前一个管道(第一组)的输出。有没有办法将两种操作合并在一起,同时保留每个管道的输出?我知道整个聚合操作的输出可以用某种语言转换为数组,并且可以计算内容,但是流水线输出可能会超过16Mb的限制。另外,为了获得计数而执行相同的查询看起来很浪费。
那么获得文件结果是否可以同时计数呢?任何帮助表示赞赏。
你真的需要一个完全准确的总数,或将逼近呢?然后再次,它看起来像你正在计算所有帖子,所以这不仅仅是一个你可以做的count()操作吗? – cirrus
我实际上是在对一组帖子进行计数,所以count()不会。 – MervS
完美的解决方案,以获得总数,同时保留聚合管道结果 http://stackoverflow.com/a/39784851/3666966 –