web-dev-qa-db-fra.com

comment comparer deux champs dans un document en agrégation de pipelines (mongoDB)

J'ai un document comme ci-dessous:

{
  "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 pendant que je vérifie d'autres paramètres dans 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 j'obtenais un résultat erroné, il renvoie toujours 4 documents dont leur budget peut ou non ê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?

10
Mohammad_Hosseini

Le problème n'est pas avec l'opérateur de comparaison, c'est le type de valeur que vous comparez. Vous devez changer les types de variables en nombres. Modifiez votre correspondance à 1, -1 ou 0 en fonction de votre comparaison.

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

Vous pouvez utiliser $expr en version 3.6.

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

Ou

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