有没有办法跨多个字段进行排序?例如按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 }]
按升序排序,其中具有较大值的字段将取代另一个字段。
答案 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_edited
或last_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。