2013-09-02 14 views
26

Mam listę mongo "_id", którą chcę usunąć. Obecnie robię to:Usuń wiele dokumentów z mongo w jednym zapytaniu

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

ale mój problem polega na tym, że lista jest zbyt duża ... (może przekroczyć 100 000 +). Dlatego zapytanie o każdy element na liście zwiększy obciążenie serwera. Jest to sposób na przekazanie całej listy w zapytaniu mongo, aby nie musieć wielokrotnie odpytywać zapytania.

Dziękuję

Odpowiedz

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

wymienić je wszystkie i użyć $in operatora:

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

Jeśli lista zawiera naprawdę ponad 100 000 artykułów, możesz podzielić ją na kilkaset sztuk na połączenie. –

3

Trzeba zdać identyfikatory w określonym formacie, używając ObjectId():

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

Remove nie robi akceptuj liczbę całkowitą - musisz użyć ObjectId wystąpienie z formatem _id jako 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); 
}); 
Powiązane problemy