2013-09-02 5 views
26

J'ai une liste de mongo '_id' que je veux supprimer. Actuellement je fais ceciSupprimer plusieurs documents de Mongo dans une seule requête

# inactive_users --> list of inactive users 
for item in inactive_users: 
    db.users.remove({'_id' : item}) 

mais mon problème est que la liste est trop grande ... (elle pourrait aller 100.000 +). L'interrogation de chaque élément de la liste ne fera qu'accroître la charge sur le serveur. Est-ce un moyen de passer la liste entière dans la requête mongo afin que je ne dois pas déclencher la requête encore et encore.

Merci

Répondre

48
db.users.remove({'_id':{'$in':inactive_users}}) 
9

Liste tous et utiliser $in opérateur:

db.users.remove({_id:{$in:[id1, id2, id3, ... ]}}) 
+2

Si la liste contient vraiment plus de 100 000 éléments, vous pouvez la décomposer en lots de quelques centaines par appel. –

3

Vous devez passer les ids dans un format spécifique en utilisant ObjectId():

db.users.remove({_id: {$in: [ObjectId('Item1'), ObjectId('Item2'), ObjectId('Item2')]}}); 

Remove doesn pas accepter entier - vous devez utiliser ObjectId instance avec le format _id en tant que string.

2
var collection = db.users; 
var usersDelete = []; 
var ObjectID = req.mongo.ObjectID; //req is request from express 

req.body.forEach(function(item){  //req.body => [{'_id' : ".." , "name" : "john"}] 
    usersDelete.push(new ObjectID(item._id)); 
}); 

collection.remove({'_id':{'$in': usersDelete}},function(){ 
    //res.json(contatos); 
}); 
Questions connexes