2016-12-29 112 views
1

我有類似下面的文檔:如何兩場管道聚合(MongoDB的)文檔中比較

{ 
    "user_id": NumberLong(1), 
    "updated_at": ISODate("2016-11-17T09:35:56.200Z"), 
    "created_at": ISODate("2016-11-17T09:35:07.981Z"), 
    "banners": { 
    "normal_x970h90": "/images/banners/4/582d79cb3aef567d64621be9/photo-1440700265116-fe3f91810d72.jpg", 
    "normal_x468h60": "/images/banners/4/582d79cb3aef567d64621be9/photo-1433354359170-23a4ae7338c6.jpg", 
    "normal_x120h600": "/images/banners/4/582d79cb3aef567d64621be9/photo-1452570053594-1b985d6ea890.jpg" 
    }, 
    "name": "jghjghjghj", 
    "budget": "2000", 
    "plan": null, 
    "daily_budget": "232323", 
    "daily_budget_auto": "", 
    "href": "qls2.ir", 
    "targets": { 
    "cats": [ 
     "fun", 
     "news" 
    ], 
    "region": "inIran", 
    "iran_states": null, 
    "os": "all", 
    "gold_network": true, 
    "dont_show_between_1_n_8": true 
    }, 
    "payment": { 
    "bank": "mellat", 
    "tax": "add" 
    }, 
    "click_cost": "102000", 
    "status": null 
} 

我要檢查,如果budget低於click_cost,而我在檢查其它一些參數我的查詢:

db.bcamp.aggregate(
    [ 
     { 
      $match:{ 
       $and: [ 
        {"targets.cats":{ 
         "$in" : ["all"] 
         } 
        }, 

        {"banners.normal_x970h90":{ 
         "$exists":true 
         } 
        }, 

        {"href": { 
         $nin: ["qls.ir"] 
         } 
        } 
       ] 
      } 
     } 
    ]).pretty(); 

我已經嘗試了比較方法,如:

db.bcamp.aggregate(
    [ 
     {$project: {ab: {$cmp: ['$budget','$clickcost']}}}, 
     {$match: {ab:{$gt:1}}} 
    ]).pretty(); 

但是我得到了錯誤的結果,它總是返回4個文件,他們的預算可能會或可能不會比click_cost更嚴重,這意味着它會提取錯誤的數據。

如何將該比較添加到我的mongoDB管道中?

回答

6

問題不在於比較運算符,它與您正在比較的值的類型。您應該將變量的類型更改爲Numbers。根據您的比較結果將您的匹配更改爲1,-1或0。

db.bcamp.aggregate(
[ 
    {$project: {ab: {$cmp: ['$budget','$clickcost']}}}, 
    {$match: {ab:{$eq:1}}} 
]).pretty(); 

您可以在3.6版本中使用$expr

db.bcamp.aggregate(
[ 
    {$match: {$expr: {$eq: ["$budget", "$clickcost"]}}} 
]).pretty(); 

或者

db.bcamp.find(
{$expr: {$eq: ["$budget", "$clickcost"]}} 
).pretty(); 
當我改變爲int預算的價值觀正在改變NumberLong(),但click_cost是像
+0

: 「click_cost」:150 –

+0

你是如何更新這些值?這些數字默認存儲爲float。您必須將它們更新爲NumberLong(「somevalue」)纔是長期價值。像這樣的db.collection.update({user_id:1},{$ set:{click_cost:NumberLong(「102000」)}})。 NumberInt爲32位值。 – Veeram

+0

好吧我已經將它們改成了NumberLong(...),然後我運行了你的代碼,但是結果中有4個對象 - 我的對象預算低於click_cost,其中一些沒有預算或click_cost值 - 這是怎麼回事發生?沒有與預算相同的對象click_cost –