2016-12-29 13 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(); 

Вы можете использовать $expr в версии 3.6.

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

Или

db.bcamp.find(
{$expr: {$eq: ["$budget", "$clickcost"]}} 
).pretty(); 
+0

при изменении значения в ИНТ бюджет меняется на NumberLong(), но click_cost это будет примерно так: "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 –

 Смежные вопросы

  • Нет связанных вопросов^_^