MongoDB集团+;排序不';行不通
我有这种情况。我收集了一些已发布的消息。信息可以共享(比如在Facebook上)。每次共享消息时,都会创建一条新消息,其中包含有关共享消息来源、原始消息以及内容可能被更改的信息。单个文档如下所示:MongoDB集团+;排序不';行不通,mongodb,sorting,aggregation-framework,Mongodb,Sorting,Aggregation Framework,我有这种情况。我收集了一些已发布的消息。信息可以共享(比如在Facebook上)。每次共享消息时,都会创建一条新消息,其中包含有关共享消息来源、原始消息以及内容可能被更改的信息。单个文档如下所示: { "_id": <id> "source": <source_id> // if it's original, own id is used "shared_from": <message_id> "trending": 4,
{
"_id": <id>
"source": <source_id> // if it's original, own id is used
"shared_from": <message_id>
"trending": 4,
"created": <Datetime>
}
当我这么做的时候,我会把结果搞得一团糟。它根本没有分类。这只是随机的。我遗漏了什么吗?您得到的结果没有排序,因为您在
$group
阶段之后没有对其进行排序。您已经按趋势对事物进行了排序,并在分组时利用了这一点,以确保只保留趋势得分最高的每个排序的\u 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 }
})
您得到的结果没有排序,因为您在
$group
阶段之后没有对其进行排序。您已经按照趋势进行了排序,并在分组时利用了这一点,以确保您只保留了具有最高趋势得分的每个排序的\u 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 }
})
如果我们从顺序阶段的初始排序中提取一些值,那么二次排序是保持顺序的最佳方式吗?@hbrannan不确定你的问题是什么。这是关于答案吗?如果我们从顺序阶段的初始排序中提取一些值,二次排序是保持顺序的最佳方式吗?@hbran南不知道你的问题是什么。是关于这里的答案吗?