Mongodb 跨多个字段排序?

Mongodb 跨多个字段排序?,mongodb,sorting,Mongodb,Sorting,有没有一种方法可以跨多个字段进行排序?e、 g.按上次编辑的和\u 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}] 按升序排序,其中值较大的字段将取代另一个字段。是的,您可以。如果您有一

有没有一种方法可以跨多个字段进行排序?e、 g.按上次编辑的
\u 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}]


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

是的,您可以。如果您有一个包含文档的集合

{_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}
您可以按两个字段(订单事项)对此进行排序:

如您所见,结果首先按
last\u edited
字段排序,然后按
\u id
排序,如果您仅按
last\u edited
字段排序,则您无法控制
\u id
字段的顺序


您可以在
last\u edited
last\u edited
\u id
字段上创建索引。

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

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

如果您的集合太大,无法通过聚合进行处理,则可以使用Gin map reduce实现类似的功能。

此查询的问题是,它仅在上次编辑的时间戳排序后,并且仅当上次编辑的时间戳出现多次时,才按id进行排序。我需要将上次编辑的和id一起排序,这意味着我不希望在排序过程中一个字段取代另一个字段。我基本上是想合并两个字段对文档进行排序,就像我对单个字段进行排序一样。这会获取所有文档,然后选择内存中较大的字段,然后按该字段进行排序吗?与创建文档时使用单个组合字段进行排序相比,它的性能是否相同或更差?肯定更差。组合和索引字段是这里最好的解决方案。我想我将在创建时生成一个时间戳,并在
更新后的
字段上对其进行编辑和排序。
db.foo.aggregate(
    {$project: {a: 1, b: 1, sortKey: {$cond: [{$gt: ["$a", "$b"]}, "$a", "$b"]}}},
    {$sort: {sortKey: 1}},
    {$project: {a: 1, b: 1}}
)