2013-04-16 4 views
12

J'essaie une simple requête dans Mongo qui ressemblerait à ceci dans MySQL.Champ Mongo Un champ supérieur à B

select * from emails where bounceCount > sentCount; 

Jusqu'à présent, j'ai.

db.email.find({ bounceCount : { $gt : sentCount } }); 

Mais je reçois cette erreur

JS Error: ReferenceError: sentCount is not defined (shell):0 

Comment puis-je référence le sentCount dans cette coquille?

Répondre

12

db.so.find("this.bounceCount > this.sentCount") est ce que vous cherchiez.

équivalent: db.so.find({"$where":"this.bounceCount > this.sentCount"})

Documentation: http://docs.mongodb.org/manual/reference/operator/where/

sortie Shell:

> db.so.insert({bounceCount:1, sentCount:2}) 
> db.so.insert({bounceCount:5, sentCount:3}) 
> db.so.insert({bounceCount:5, sentCount:4}) 
> db.so.insert({bounceCount:5, sentCount:7}) 
> db.so.insert({bounceCount:9, sentCount:7}) 

> db.so.find() 
{ "_id" : ObjectId("516d7f30675a2a8d659d7594"), "bounceCount" : 1, "sentCount" : 2 } 
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 } 
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 } 
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 } 
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 } 

> db.so.find({"bounceCount":5}) 
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 } 
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 } 
{ "_id" : ObjectId("516d7f3d675a2a8d659d7597"), "bounceCount" : 5, "sentCount" : 7 } 

> db.so.find("this.bounceCount > this.sentCount") 
{ "_id" : ObjectId("516d7f37675a2a8d659d7595"), "bounceCount" : 5, "sentCount" : 3 } 
{ "_id" : ObjectId("516d7f3b675a2a8d659d7596"), "bounceCount" : 5, "sentCount" : 4 } 
{ "_id" : ObjectId("516d7f40675a2a8d659d7598"), "bounceCount" : 9, "sentCount" : 7 } 
16

Tout le monde semble parler $where sans vraiment savoir que il est:

  • lente
  • insécurité (evaled)
  • JavaScript, pas MongoDB Fonctionnement interne
  • Et, sur les versions antérieures à 2.4, seule

fileté et global verrouillé Une autre méthode qui serait beaucoup mieux pour environ 99% des cas est d'utiliser le cadre d'agrégation:

db.col.aggregate([ 
    {$project: {ab: {$cmp: ['$bounceCount','$sentCount']}}}, 
    {$match: {ab:{$gt:0}}} 
]) 
+0

Je ne vois pas la partie "non sécurisée" de la réponse que j'ai donnée. –

+0

@JoeFrambach Le paramètre '$ where' prend une chaîne, un peu comme écrire du SQL sans bibliothèque d'échappement. – Sammaye

+3

Mais c'est le développeur qui écrit la requête. A aucun moment l'entrée de l'utilisateur n'a été évaluée –

Questions connexes