0

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

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

我可以手动完成,但我有 100 多个集合,并且 db["X"].remove({ "DateTime": { $regex : "2015-11-16" } })为每个集合手动输入 mongo shell 需要相当长的时间。

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

4

3 回答 3

2

在 mongo 外壳中:

 db.getCollectionNames().forEach(function(name) {
     db[name].remove({ "DateTime": { $regex : "2015-11-16" } });
 })
于 2015-11-16T11:18:41.163 回答
2
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" } });
    }
}

请注意,我从列表中排除了系统集合。

于 2015-11-16T11:15:46.970 回答
1

Well.startsWith()是一项新技术,是 ECMAScript 2015 (ES6) 标准的一部分,因此它可能无法在 Mongo Shell 中运行。

您将需要使用该.filter()方法丢弃系统集合

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/ } )
}
于 2015-11-16T15:49:59.663 回答