我有这种情况。我收集了发布的消息。消息可以共享(如在Facebook上)。每次共享消息时,创建一个新消息,其中包含关于它共享哪个消息的信息,哪个消息是原始消息,并且内容可以被改变。单个文档如下所示:
{
"_id": <id>
"source": <source_id> // if it's original, own id is used
"shared_from": <message_id>
"trending": 4,
"created": <Datetime>
}
trending
字段告诉我&#39;质量&#39;消息。
现在,问题出在这里 - 我需要获得一些最好的消息。我也需要它们来源独特。这是我想出的,它应该有用(但它没有)
db.Messages.aggregate({
{ $sort: { trending: -1 } },
{ $group: { _id: "$source", doc_id: { $first: "$_id" } } },
{ $project: { _id: "$doc_id" } },
{ $limit: 6 }
})
当我这样做时,我完全搞砸了结果。它根本没有排序。它只是随机的。我错过了什么吗?
答案 0 :(得分:3)
您获得的结果未排序,因为您未在$group
阶段后对其进行排序。您已经按趋势对事物进行了排序,并在您进行分组时利用了这一点,以确保您只保留了具有最高趋势分数的每种排序的_id
值。但是不能保证$group
最终会保留任何特定的顺序,因此您应该再次排序,为此您需要保持趋势分数(假设您打算按趋势分数下降保持顺序。
这样的事情会起作用:
db.Messages.aggregate({
{ $sort: { trending: -1 } },
{ $group: { _id:"$source", doc_id:{$first: "$_id"}, trend:{$first:"$trending"}}},
{ $sort:{trend:-1} },
{ $project: { _id: "$doc_id" } },
{ $limit: 6 }
})