跨多个字段排序?

时间:2013-11-04 06:14:02

标签: mongodb sorting

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

e.g。

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

mongo返回:

[{ 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 }]

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

2 个答案:

答案 0 :(得分: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字段中添加索引。

答案 1 :(得分:1)

您可以使用聚合框架来实现,但是您将无法使用索引,因为它是一种相当强大的解决方案。

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

如果你的集合很大,可以通过聚合处理类似的东西,可以实现usgin map-reduce。