我的藏品有超过820万份文件。我需要通过查询删除2-3百万个(属性或两个属性被索引)。
我担心的是,由于oplog比我的容量增长更大,然后需要我从备份重新播种所有内容,导致我的辅助设备落后。
会是这样的......
db.my_collection.remove({attribute_1:'xyz'},false);
或
db.my_collection.remove({attribute_1:'xyz',attribute_2:'abc'},false);
是一个oplog条目,不会对我的辅助文件产生负面影响(除了实际删除文档)?或者它会被翻译成2-3百万次复制操作吗?
我认为答案是它将是一个操作,我可能需要从中恢复一些碎片,但不一定是oplog /辅助同步问题。
答案 0 :(得分:2)
对于在主要文件中删除的每个文档,您最终会在oplog中输入单个条目。
因此,如果您在主服务器上删除了300万个文档,那么您最终将通过辅助服务器上的_id密钥删除300万个删除语句。
我会批处理它们并根据滞后限制删除,然后压缩或重新同步。
如果您有大量文档移动,您可能需要考虑使用paddingFactor集进行压缩。
答案 1 :(得分:2)
通过创建一个集合并向remove()
添加一些匹配的文档来测试它是很容易的。
然后,您可以检查oplog以查看生成的条目:
use local
db.oplog.rs.find({op:'d'})
为了确保在主要和辅助文档上删除相同的文档,删除的每个文档都会在oplog中生成一个条目。
例如,在op: 'd'
匹配两个文档后,oplog(remove()
)中的条目被删除:
{
"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")
}
}