2011-02-24 12 views

回答

2

您可以添加第三个字段,a/b的结果并按它排序。

您的文档将看起来像:

{'a' : x , 'b' : y, c : z} // z = x/y 

,你会被“C”进行排序:

find().sort({c : 1}) 
+0

是否有任何方式定义此字段的方式,每次x或y递增,字段c更新它的值? – 2011-02-24 21:01:10

+0

不,没有其他的方法(除了@AdaTheDev所说的JavaScript函数,这将工作缓慢)。您可以在一个操作中增加和更新。 – 2011-02-24 21:02:55

2

我不相信这是可能的,因为你也不能运行比较2个字段的查询(不使用$ where来指定一个JavaScript函数,这将会很慢)。相反,我怀疑你还需要在文档中分别存储比例,然后在新的字段上进行排序。

0

就像Bugai13说,你需要一个需要的第三个属性的集合,以便进行排序。您可以通过调用mapReduce来添加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}); 
相关问题