web-dev-qa-db-fra.com

Supprimer plusieurs documents de mongo en une seule requête

J'ai une liste de mongo '_id' que je veux supprimer. Actuellement je fais ça

# 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 longue ... (ça pourrait aller à 100 000 +). Ainsi, interroger chaque élément de la liste ne fera qu'augmenter la charge du serveur. Est-ce leur un moyen de passer la liste entière dans la requête Mongo afin que je n'ai pas à lancer la requête encore et encore.

Je vous remercie

32
Anurag Sharma
db.users.remove({'_id':{'$in':inactive_users}})
62
Roman Pekar

Répertoriez-les tous et utilisez l'opérateur $in:

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

Vous devez transmettre les identifiants dans un format spécifique à l'aide de ObjectId()

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

Remove n'accepte pas d'entier - vous devez utiliser une instance ObjectId avec le format _id en tant que string

6
julien bouteloup
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);
});
4
user2878540

J'avais la même question et ai couru à travers ces réponses, mais il semble que le manuel de MongoDB recommande deleteMany au lieu de supprimer. deleteMany renvoie le nombre de suppressions ainsi qu'un accusé de réception du problème d'écriture (si l'opération a réussi).

const ids = [id1, id2, id3...];
const query = { _id: { $in: ids} };
dbo.collection("users").deleteMany(query, function (err, obj) {
    if (err) throw err;
});

Ou avec une fonction de flèche:

const ids = [id1, id2, id3...];
const query = { _id: { $in: ids} };
dbo.collection("users").deleteMany(query, (err, obj) => {
    if (err) throw err;
});

Ou mieux encore, avec une promesse:

const ids = [id1, id2, id3...];
const query = { _id: { $in: ids} };
dbo.collection("users").deleteMany(query)
.then(result => {
    console.log("Records Deleted");
    console.log(JSON.stringify(result));
    //for number removed...
    console.log("Removed: " + result["n"]);
})
.catch(err => {
    console.log("Error");
    console.log(err);
});
0
docb45