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?
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();