【发布时间】:2016-06-17 21:22:32
【问题描述】:
就在有人提议我在聚合查询中使用$slice 之前,我正在使用 mongolab 作为我的后端引擎,它不支持 mongo 3.2,它只支持最高 3.0,所以我不能使用$slice。
我正在尝试从评论者数组中获取前两个评论者的姓名。
完成一些聚合魔术后,数据集如下所示:
{ "_id" : "e", "commentor" : [ "John", "Bethany", "Mary", "Peter", "Mike", "Simon" ]}
{ "_id" : "f", "commentor" : [ "Sam", "Jan", "George", "Fred", "Greg", "Paul", "Ben" ]}
在每个帖子中,我都有一个评论者列表。
这个想法是只提取前 2 个评论者,然后对数组执行 $size,这样我就可以生成仅包含相关信息的活动提要。例如,对于帖子 id = e,我希望活动提要说:
John, Bethany and 4 other people commented on post e.
我可以很容易地对 $first 评论者进行聚合查询,方法是:
group2 = {
"$group" : {
"_id" : "$_id",
"commentor" : {
"$first" : "$commentor"
}
}
}
在这种情况下,我的活动提要会显示:
John and 5 other people commented on post e.
但我希望我的结果是这样的:
John, Bethany and 4 other people commented on post e.
在 mongo 3.0 上有没有办法做到这一点?
【问题讨论】:
-
我认为 3.0 中的聚合框架没有任何方法可以做到这一点。如果这是管道中的最后一个阶段,那么您可以使用客户端处理来检索数组中的前两个元素。
-
我知道你可以做到,但现在你的帖子上有 1000 个 cmets,下载文档需要太长时间,并且客户端会耗尽内存。
-
您可以
$unwind数组和$limit结果,但这也会很昂贵,因为$unwind的工作方式。但是我可以准确地告诉这里最好的选择是什么,因为我无法访问您的管道。 -
如果我的社交网络中有多个帖子,我认为 $unwind 和 $limit 不会起作用。我需要分别将帖子 e 限制为 2,将帖子 f 限制为 2,并且我不希望将限制应用于所有帖子。
-
这就是为什么我一开始没有把它作为答案发布。
标签: javascript mongodb aggregation-framework