【问题标题】:Iterate over MongoDB collection and remove documents per two consecutive ids遍历 MongoDB 集合并删除每两个连续 id 的文档
【发布时间】:2018-06-11 13:04:19
【问题描述】:

是否有任何快速有效的方法来迭代 MongoDB 集合并删除每个连续 id 的文档?

我的收藏文件格式如下:

{ 
"_id" : "USD/JPY-2011-04-13T09:34:04.365Z", 
"pair" : "USD/JPY", 
"dateTime" : ISODate("2011-04-13T09:34:04.365+0000"), 
"bid" : 83.98, 
"ask" : 83.992, 
"bidVolume" : 1.309999942779541, 
"askVolume" : 1.5

}

目前,我发现根据日期时间删除文档的唯一解决方法是:

var bulk = db.collection.initializeUnorderedBulkOp();
bulk.find( { "dateTime":{ $lte : ISODate("2012-01-01T00:00:00.000Z") } } ).remove();
bulk.execute();

但它真的很慢,删除大约。每秒 10,000 个文档(我的集合包含 50 亿个文档)。

【问题讨论】:

  • 真的不清楚你在问什么。您列出的代码不仅不是“每两个连续删除”,而且在这种形式下也没有必要,因为所有 MongoDB CRUD API 方法都使用下面的“批量”接口。所以db.collection.deleteMany({ "datetime": { "$lte" : new Date("2012-01-01") } }) 是完全一样的。但仍然与问题的文本或标题无关。
  • 感谢您及时回复尼尔。也许你是对的,我发布的只是从 MongoDB 集合中删除文档的传统方式,但我暗示的(..或最初想说的)是关于如何将此语句转换为“每两个删除”的建议/提示连续”的文件。你有什么建议吗?

标签: mongodb performance mongodb-query


【解决方案1】:

我终于找到了一种快速简便的方法:

var cnt = 0;
var docsToDelete = [];

db.collection_name
  .find( { "dateTime":{ $lte : ISODate(threshold_timestamp) } } )
  .forEach( function(myDoc) 
            {
                if (cnt % 2 == 0){  
                    docsToDelete.push(myDoc._id);
                }
                cnt++;
            }
  );
db.dc_historic_ticks.remove({'_id':{'$in': docsToDelete}});

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2011-06-12
    • 2017-04-11
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多