2013-11-04 97 views
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 }]

从小到大顺序的场更大的价值取代了其他领域。

回答

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实现。

+0

这是否获取所有文档,然后选择内存中的更大的领域,然后排序呢?它会执行相同的还是比从一个单一的组合字段进行文档创建时的排序还差? – paulkon

+1

肯定更糟。合并和索引字段是最好的解决方案。 – zero323

+0

我想在创建和编辑将来上'updated'场我就产生一个时间戳和排序就可以了。 – paulkon

1

是的,可以。如果你有documentes集合

{_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领域。

+0

与此查询的问题是,它只能通过各种_id后last_edited已排序,只有当最后编辑时间戳记发生不止一次。我需要将last_edited和_id **一起排序**,这意味着我不希望一个字段在排序过程中取代另一个字段。我基本上想要在对文档进行排序时合并这两个字段,就像我在单个字段上进行排序一样。 – paulkon