web-dev-qa-db-ja.com

1つのクエリでmongoから複数のドキュメントを削除する

削除するmongo '_id'のリストがあります。現在、私はこれをやっています

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

しかし、私の問題はリストが大きすぎることです...(100,000以上になるかもしれません)。したがって、リスト内のすべてのアイテムを照会すると、サーバーの負荷が増加するだけです。リスト全体をmongoクエリに渡す方法であるため、何度もクエリを実行する必要はありません。

ありがとうございました

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

それらをすべてリストし、$in演算子を使用します。

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

ObjectId()を使用して特定の形式でIDを渡す必要があります。

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

Removeは整数を受け入れません-ObjectIdとして_id形式のstringインスタンスを使用する必要があります。

6
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
VIctor Hugo

私は同じ質問をして、これらの答えに出くわしましたが、MongoDBマニュアルはremoveではなくdeleteManyを推奨しているようです。 deleteManyは、削除カウントと書き込みの懸念の確認を返します(操作が成功した場合)。

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

または、矢印関数を使用して:

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

または、さらに良いことには、約束があります:

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);
});
1
docb45