3

假设我有很多文档,例如 {'a' : x , 'b' : y}。假设 x 和 y 是整数。我该怎么做find().sort({'a'/'b'})

4

4 回答 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 },
}
]);

就是这样。我们使用聚合框架的$divide运算符。

于 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 回答