假设我有很多文档,例如 {'a' : x , 'b' : y}。假设 x 和 y 是整数。我该怎么做find().sort({'a'/'b'})
?
1090 次
4 回答
2
自 2011 年提出这个问题以来,MongoDB 已经发布了聚合框架。它允许您按字段组合进行排序,并且您不需要存储(非规范化)任何额外的字段。这是如何完成的:
db.collection.aggregate([
{
$match: {
// Optional criteria to select only some documents to process, such as...
deleted: null
}
},
{
$project: {
// Need to prefix fields with '$'
ratio: { $divide: [ "$a", "$b" ] },
}
},
{
$sort: { ratio: -1 },
}
]);
于 2019-05-24T09:28:38.280 回答
1
我不相信这是可能的,因为您也无法运行比较 2 个字段的查询(不使用 $where 来指定一个很慢的 javascript 函数)。相反,我怀疑您还需要将比率单独存储在文档中,然后对该新字段进行排序。
于 2011-02-24T20:58:40.153 回答
1
您可以添加第三个字段,a/b 的结果并按其排序。
您的文档将如下所示:
{'a' : x , 'b' : y, c : z} // z = x/y
您将按“c”排序:
find().sort({c : 1})
于 2011-02-24T20:59:27.950 回答
-1
就像 Bugai13 所说,您需要在您的集合中需要第三个属性才能执行排序。您可以通过调用 mapReduce 来添加 ratio 属性(如下所示),但这在大型集合上不会非常快 - 并且会在数据库运行时锁定您的数据库。你真的应该手动保持 ratio 属性是最新的——这应该不是很难。
db.data.insert({a: 1, b: 1});
db.data.insert({a: 2, b: 2});
db.data.insert({a: 3, b: 3});
db.data.insert({a: 1, b: 4});
db.data.insert({a: 2, b: 1});
db.data.insert({a: 3, b: 2});
db.data.insert({a: 1, b: 3});
db.data.insert({a: 2, b: 4});
db.data.insert({a: 3, b: 1});
db.data.insert({a: 1, b: 2});
db.data.insert({a: 2, b: 3});
db.data.insert({a: 3, b: 4});
db.data.mapReduce(
function(){
emit(this._id, this);
},
function(k, vs){
v = vs[0];
v.c = v.a / v.b;
return v;
},
{out : 'data'}
);
db.data.find().sort({c:1});
于 2011-02-25T00:28:32.557 回答