0

有没有办法跨多个字段进行排序?例如排序last_edited_id时间戳?本质上,我需要对这两个字段进行排序,就好像它们是一个字段一样。所以复合索引似乎不适用于这种情况。

例如

对于索引{ a: 1, b: 1 }::

蒙戈返回:

[{ a: 1, b: 1 }, { a: 1, b: 4 }, { a: 2, b: 2 }, { a: 2, b: 3 }]

虽然我需要它返回:

[{ a: 1, b: 1 }, { a: 2, b: 2 }, { a: 1, b: 3 }, { a: 1, b: 4 }]

按升序排序,其中具有较大值的字段取代另一个字段。

4

2 回答 2

1

是的你可以。如果你有一个带有文档的集合

{_id : 5, last_edited : 7}
{_id : 4, last_edited : 1}
{_id : 9, last_edited : 7}
{_id : 3, last_edited : 1}
{_id : 6, last_edited : 1}

您可以按两个字段(顺序很重要)对其进行排序:

db.a.find().sort({last_edited: 1, _id : 1})

如您所见,结果首先按last_edited字段排序,然后按 排序_id,如果您仅按last_edited字段进行排序,则无法控制_id字段的顺序。

您可以在last_editedlast_edited_id字段上建立索引。

于 2013-11-04T06:32:16.553 回答
1

您可以使用聚合框架来做到这一点,但您将无法使用索引,因为它是一个相当暴力的解决方案。

db.foo.aggregate(
    {$project: {a: 1, b: 1, sortKey: {$cond: [{$gt: ["$a", "$b"]}, "$a", "$b"]}}},
    {$sort: {sortKey: 1}},
    {$project: {a: 1, b: 1}}
)

如果您的集合太大而无法通过聚合处理,则可以使用 map-reduce 来实现类似的事情。

于 2013-11-04T07:59:49.067 回答