1

J'ai un document comme ci-dessous:comment comparer deux champs dans un document dans l'agrégation de pipeline (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 
} 

Je veux vérifier si budget est inférieur à click_cost alors que je vérifie d'autres paramètres ma requête:

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

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

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

J'ai essayé de comparer la méthode comme:

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

Mais je recevais un mauvais résultat, il retourne toujours 4 document dont le budget peut être plus élevé que click_cost, ce qui signifie qu'il récupère des données erronées. Comment puis-je ajouter cette comparaison à mon pipeline mongoDB?

Répondre

6

Le problème n'est pas avec l'opérateur de comparaison, c'est le type de valeur que vous comparez. Vous devriez changer les types de variables en nombres. Changez votre match à 1, -1 ou 0 selon votre comparaison. Vous pouvez utiliser $expr dans la version 3.6.

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

Ou

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

quand je change les valeurs int le budget est en train de changer à NumberLong() mais click_cost est d'être comme: "click_cost": 150 –

+0

Comment êtes-vous actualisent ces valeurs? Les numéros sont stockés par défaut en tant que float. Vous devez les mettre à jour en tant que NumberLong ("somevalue") pour avoir une valeur longue. Quelque chose comme ça db.collection.update ({user_id: 1}, {$ set: {click_cost: NumberLong ("102000")}}). NumberInt pour les valeurs de 32 bits. – Veeram

+0

Ok, je les ai changés en NumberLong (...) et puis j'ai couru votre code mais j'ai 4 object dans result- dont le budget de mes objets est inférieur à click_cost et certains d'entre eux n'ont pas de budget ou click_cost value - comment ça passe? –