我有一个有超过820万份文件的收藏。我需要通过查询删除其中的2-3百万(属性或两个属性被索引)。
我担心的是,我的第二次考试落后了,因为我的oplog变得比我的能力还大,然后需要我从备份中重新播种它们。
像这样的事..。
db.my_collection.remove({attribute_1:'xyz'},false);或
db.my_collection.remove({attribute_1:'xyz',attribute_2:'abc'},false);是一个不会对我的第二次访问产生负面影响的oplog条目(除了实际删除文档)吗?还是会被翻译成230万次复制操作?
我认为答案是,这将是一个操作,我将有一些碎片,我可能需要恢复,但不一定是一个oplog/次要同步问题。
发布于 2013-09-23 21:31:05
最后,您将在oplog中为每个在主文件上删除的文档提供一个单独的条目。
因此,如果在主服务器上删除了300万个文档,则最终将有300万条通过次要文件上的_id键进行删除的语句。
我会对它们进行批次处理,然后根据滞后情况对删除进行节流,然后再压缩或重新生成。
如果您有大量的文档移动,您可能需要考虑使用paddingFactor集。
发布于 2013-09-23 21:34:28
通过创建一个集合并向remove()添加一些匹配的文档,可以很容易地对其进行测试。
然后,您可以检查oplog以查看生成了哪些条目:
use local
db.oplog.rs.find({op:'d'})为了确保在主文件和次要文件上删除相同的文档,每个删除的文档在oplog中生成一个条目。
例如,在匹配两个文档的op: 'd'( remove() )之后删除了oplog中的条目:
{
"ts" : Timestamp(1379971718, 1),
"h" : NumberLong("8227301495520897544"),
"v" : 2,
"op" : "d",
"ns" : "test.foo",
"b" : true,
"o" : {
"_id" : ObjectId("5240b21e2fa8b603e8aaaceb")
}
}
{
"ts" : Timestamp(1379971718, 2),
"h" : NumberLong("-5339031341149346886"),
"v" : 2,
"op" : "d",
"ns" : "test.foo",
"b" : true,
"o" : {
"_id" : ObjectId("5240b2202fa8b603e8aaacec")
}
}https://stackoverflow.com/questions/18968812
复制相似问题