MongoDB组+排序不起作用

时间:2014-03-31 23:02:00

标签: mongodb sorting aggregation-framework

我有这种情况。我收集了发布的消息。消息可以共享(如在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 }
})

当我这样做时,我完全搞砸了结果。它根本没有排序。它只是随机的。我错过了什么吗?

1 个答案:

答案 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 }
})