MongoDB shell: 如何删除数据库中所有 collections 中的特定元素

MongoDB shell: How to remove specific elements in all the collections inside a DB

我想删除所有 collection 中与正则表达式的所有巧合。

我需要这个,因为 JSON 解析器在今天的某个时间点在我的应用程序中失败,现在数据库已损坏。

我可以手动完成,但我有超过 100 多个 collection,并且手动输入 mongo shell db["X"].remove({ "DateTime": { $regex : "2015-11-16" } }) 对应每个 collection 会花费不少时间。

您知道在 mongo shell 中自动执行此操作的任何方法吗?我总是通过 R 中的包 RMongo 访问这个数据库,我可以通过 dbRemoveQuery(rmongo.object, collection, query) 来访问这个数据库,但我想知道它是否可以在 mongo shell 中完成,也许有点更快。

use yourDbName

// Get the names of all collections in the database.
var names = db.getCollectionNames();

// Iterate over every collection name.
for(i = 0; i < names.length; i++) {

    // Only issue the query if the collection is not a system collection.
    if(!names[i].startsWith("system.")) {

        // Issue the query against the collection with the name `names[i]`.
        db[names[i]].remove({ "DateTime": { $regex : "2015-11-16" } });
    }
}

请注意,我从列表中排除了 system collections

在mongo shell:

 db.getCollectionNames().forEach(function(name) {
     db[name].remove({ "DateTime": { $regex : "2015-11-16" } });
 })

.startsWith() 是一项新技术,是 ECMAScript 2015 (ES6) 标准的一部分,因此它可能不适用于 Mongo Shell。

您将需要使用 .filter() 方法来丢弃系统 collections

var collections = db.getCollectionNames().filter(function(collection) {
    return collection.indexOf('system.') !== -1;
};

然后在此处删除符合您条件的文档 "DateTime": "2015-11-16"

for(var index=0; index < collections.length; index++) {
    db[collections[index]].remove( { 'DateTime': /2015-11-16/ } )
}