gpt4 book ai didi

mongodb 获取具有最高值的文档/子文档

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

我有一个像这样的评论集合

{
_id: 'c1',
text: 'comment 1',
votes: 1,
replies: [
{
_id: 'r1',
text: 'reply 1',
isReply: true,
votes: 3
},
{
_id: 'r2',
text: 'reply 2',
isReply: true,
votes: 0
}
]
},
{
_id: 'c2',
text: 'comment2',
votes: 2,
replies: []
}

想法是一条评论可以有很多回复。所有评论和回复都有 idtextvotes。我怎样才能获得最好的 2 条评论或获得最多 投票 的回复。在给定的情况下,这将是“回复 1”和“评论 2”。

我可以向 mongodb 发送 1 个请求以获得最好的 2 条评论,然后向 mongodb 发送另一个请求以获得最好的 2 条回复,然后比较它们以获得我想要的结果。

但是,是否可以只向 mongodb 发出 1 个请求,就可以得到这样的结果?

 [
{
_id: 'r1',
text: 'reply 1',
isReply: true,
votes: 3
},
{
_id: 'c2',
text: 'comment 2',
votes: 2
}
]

或者更好的是,我可以将评论/回复展平,以得到按投票 排序的评论或回复列表吗?在这种情况下,它将是 [r1, c2, c1, r2] 及其各自的属性

谢谢。


更新:我尝试了 aggregate({$unwind: '$replies'}) 但我仍然有 2 个不同级别的评论和回复,我无法使用聚合框架进行比较。也许有一种方法可以压平这两个级别,我是 mongodb 的新手。

最佳答案

对架构进行一些小改动以对投票进行非规范化,这样可以更轻松地进行排序。如果在评论文档中嵌入了另一个投票数组,例如:

votes: [ 
{ "type" : "c", "_id": "c1", v: 1},
{ "type" : "r", "_id": "r1", v: 3},
{ "type" : "r", "_id": "r2", v: 2}
]

查询和排序可以很简单。

db.playground.aggregate(
[
{$project: { votes: 1 }},
{$unwind: "$votes"},
{$sort: {"votes.v": -1}},
{$limit: 2}
])

它给出了以下结果。

{
"result" : [
{
"_id" : "c1",
"votes" : {
"type" : "c",
"_id" : "c1",
"v" : 3
}
},
{
"_id" : "c1",
"votes" : {
"type" : "r",
"_id" : "r1",
"v" : 2
}
}
],
"ok" : 1
}

需要一个关于 votes.v 的索引,因为它看起来像是一个阅读量很大的用例。更新评论时,只需在同一个更新请求中更新投票数组即可。

关于mongodb 获取具有最高值的文档/子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818628/

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