这是我的排序对象:
{
income: 1,
age: 1
}
问题是income
在理论上是一个实数,因此是唯一的。因此,这可能使age
没有效果,除非income
可以被分类。
如何在MongoDB聚合中指定这个?如果可能的话,这个清理行动会不会太昂贵?
这可以很容易地通过聚合阶段实现:
db.collection.aggregate([
{$set: { roundedIncome: { $floor: "$income"}}},
{$sort: {"roundedIncome": 1, "age": 1}}
])
您当然可以将$floor
更改为您想要的分辨率的任何表达式(例如,1dp等)。
正如你所指出的——这有性能方面的考虑——最大的一个是如果你希望在income
上使用索引进行排序——现在不会这样了,这将导致内存中排序(有相应的限制)。
否则的成本将相当于每个文档查看1个Math.floor
操作。这可能最终成为整个集合-因为你不能跳过/限制,直到你已经排序,你不能排序,直到你运行$set
。
您可以通过先在income
上运行排序,然后跳过/限制,然后在最后运行$set
+$sort
来在一定程度上否定成本-您的结果将稍微不准确-但可能是可接受的