gpt4 book ai didi

javascript - 在 MongoDB 3.0 中的聚合查询中获取数组的前 2 个元素

转载 作者:可可西里 更新时间:2023-11-01 09:54:38 27 4
gpt4 key购买 nike

就在有人建议我在聚合查询中使用 $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 上执行此操作?

最佳答案

在聚合管道中使用 $match、$project、$unwind、$limit 和 $group 我们可以实现它。

下面是神奇的查询。

db.stackoverflow1.aggregate([
{$match : { "_id": "e" }}, // Pass the value of post you want to retrieve, in this query we are passing "e"
{$project: {commentor: 1, numberOfCommentors: { $size: "$commentor" }}},
{$unwind: "$commentor"},
{$limit : 2 },
{$group : {"_id":{_id:"$_id", numberOfCommentors:"$numberOfCommentors"},
myArr:{$push: {commentor :"$commentor"}}
}}
])

工作原理管道中的第一个查询是 $match,它有助于我们减少结果

 db.stackoverflow1.aggregate([ {$match : { "_id": "e"  }} ])

这部分会产生我们

{ "_id" : "e", "commentor" : [ "John", "Bethany", "Mary", "Peter", "Mike", "Simon" ] }

现在我们有了所需的记录,但我们必须努力显示 2 个评论者的姓名和评论者的数量

$project 是我们聚合管道的下一部分,我们将评论者及其计数预测到下一阶段。

我们对 $project 的查询

db.stackoverflow1.aggregate([ {$match : { "_id": "e"  }},
{$project: {commentor: 1, numberOfCommentors: { $size: "$commentor" }}} ])

执行此查询后,我们的结果集将是

{ "_id" : "e", "commentor" : [ "John", "Bethany", "Mary", "Peter", "Mike", "Simon" ], "numberOfCommentors" : 6 }

我们只是将评论者的数量添加到之前查询中的预期结果中,并将其转换到管道的下一阶段。

现在我们需要展开我们的 commentors 数组以只接受两个评论

我们用 $unwind 查询

 db.stackoverflow1.aggregate([
{$match : { "_id": "e" }},
{$project: {commentor: 1, numberOfCommentors: { $size: "$commentor" }}},
{$unwind: "$commentor"}
])

现在执行查询 $unwind 后,我们的结果将如下所示

{ "_id" : "e", "commentor" : "John", "numberOfCommentors" : 6 }
{ "_id" : "e", "commentor" : "Bethany", "numberOfCommentors" : 6 }
{ "_id" : "e", "commentor" : "Mary", "numberOfCommentors" : 6 }
{ "_id" : "e", "commentor" : "Peter", "numberOfCommentors" : 6 }
{ "_id" : "e", "commentor" : "Mike", "numberOfCommentors" : 6 }
{ "_id" : "e", "commentor" : "Simon", "numberOfCommentors" : 6 }

我们展开了commentors数组,我们也得到了commentors的计数,剩下的就是将计数限制为2并对其进行分组,这是我们的最终查询,执行最终查询后的结果是

{ "_id" : { "_id" : "e", "numberOfCommentors" : 6 }, "myArr" : [ { "commentor" : "John" }, { "commentor" : "Bethany" } ] }

关于javascript - 在 MongoDB 3.0 中的聚合查询中获取数组的前 2 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37890563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com