2013-03-13 4 views
3

Je développe une application avec Mongoose pour accéder à MongoDB.Filtrer les résultats de la requête avec mongoose sur node.js

Et ce que j'essaye de réaliser est de faire une requête et discar certains documents par id.

User.find({}) 
    .where('price').lt(upperLimit) 
    .... 
    .exec(function(err, users) { 
     // 
    }); 

Le point est que je veux jeter certains utilisateurs que je connais avant de faire la requête. Des idées?. Je ne veux pas post-traiter les collections d'utilisateurs et filtrer.

Merci!

Répondre

2

Vous pouvez utiliser l'opérateur $ne:

User.find({"_id":{"$ne":<IdToExclude>}}). … 
+0

Ok, mais si elle, un tableau d'objets? –

+0

Pour les tableaux, vous pouvez utiliser l'opérateur [$ all] (http://docs.mongodb.org/manual/reference/operator/all/). 'User.find ({" ids ": {" $ ne ": {" $ all ": [, , ...]}}}). ... ' – nutlike

+0

Je pense que l'approche JohnnyHK est la meilleure mais pourriez-vous nous faire savoir si celui-ci fonctionne aussi? – nutlike

3

Vous pouvez utiliser l'opérateur $nin pour exclure un tableau de valeurs _id:

User.find({}) 
    .where('price').lt(upperLimit) 
    .nin('_id', idsToExclude) 
    .... 
    .exec(function(err, users) { 
    // 
    }); 
+1

Je suggère de ne pas utiliser l'opérateur $ nin si possible et d'utiliser plutôt l'opérateur $ ne car $ nin n'est pas capable d'utiliser un index (les index sont inclusifs non exclusifs), forçant ainsi un scan de table sur tous les documents. – christkv

+1

@christkv En fait, ni les indices $ nin' ni $ ne utilisent efficacement les index (voir [ici] (http://docs.mongodb.org/manual/faq/indexes/#using-ne-and-nin-in -a-query-is-slow-why)), mais comme noté @nutlike dans ses commentaires, '$ ne' ne fonctionne pas dans ce cas. Tant qu'un autre terme de recherche est inclus en premier (dans ce cas 'price'), le' $ nin' n'a besoin que de parcourir les docs avec le prix correspondant, et non la collection entière. – JohnnyHK

Questions connexes