2017-05-22 62 views
0

我希望得到一個的MongoDB集合堅持這個條件的記錄:

FIELDA> fieldB + someNaturalValue

這是我試過到目前爲止:蒙戈領域的大於磁場B加上一個值

db.getCollection('collection').find({ 
$where: function() { 
    return this.fieldA > this.fieldB + 10000} 
}); 
// or 
db.getCollection('collection').aggregate([ 
    { "$project" : { 
     "sum" : {"$add" : ["$fieldB", 10000]} 
     } 
    }, 
    { "$match" : { 
     "sum" : {"$lte" : "$fieldA"}  
     } 
    } 
]); 

我在這裏所面臨的問題是,我需要在條件添加到域的一個額外的價值。
那些不起作用,那個價值沒有被考慮。
我缺少什麼?我很感激任何幫助。

樣本數據

db.collection.insert({fieldA : 21000, fieldB : 10000}); //1 ok 
db.collection.insert({fieldA : 15000, fieldB : 8000}); //2 nok 
db.collection.insert({fieldA : 24000, fieldB : 22000}); //3 nok 
db.collection.insert({fieldA : 22000, fieldB : 1000}); //4 ok 
+1

您可以粘貼一個小例子數據集在$,以'db.collection.insert'調用的形式,以便我們可以使用它? –

+0

我已經測試了我自己的沙箱上的兩個查詢,並且他們都正常工作。即使fieldB是一個字符串值 –

+0

大家好。感謝您的快速回復。從指出的可能重複的問題的答案確實有效,但它使用了另一個我很好的功能,但** **的替代方案呢?我也想使用這個,因爲對於聚合,我需要額外執行一個步驟來查看整個文檔,而不僅僅是id。 即便如此,我是否應該僅僅因爲重複而接受,比方說,它的一半已經解決了? – alexandrum

回答

0

從複製的問題,調整代碼:

db.collection.aggregate([ 
    {$project: { 
     cmp_value: {$cmp: ['$fieldA', {$add: ['$fieldB', 10000]}]}, 
     obj: '$$ROOT' 
    }}, 
    {$match: {cmp_value: {$gt: 0}}}, 
    { $replaceRoot: { newRoot: '$obj' } } 
]) 

$where應儘量避免使用。 Documentation是它很清楚:

,其中提供了更大的靈活性,但需要數據庫處理JavaScript表達式或函數對每個文檔集合

+0

我只是想知道這個$在哪裏以及爲什麼在那裏,即使文檔說這不是指示要使用的。這更多是我的問題的好奇心。感謝您指出這一點,現在我會盡量避免它。 – alexandrum