Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MongoDB:有一段时间,我得到的文档比使用散列切分键插入的文档还要多。这不';使用碎片键不会发生这种情况_Python_Mongodb_Count_Pymongo_Bulk - Fatal编程技术网

Python MongoDB:有一段时间,我得到的文档比使用散列切分键插入的文档还要多。这不';使用碎片键不会发生这种情况

Python MongoDB:有一段时间,我得到的文档比使用散列切分键插入的文档还要多。这不';使用碎片键不会发生这种情况,python,mongodb,count,pymongo,bulk,Python,Mongodb,Count,Pymongo,Bulk,我正在Ubuntu服务器14.04 64位操作系统上使用MongoDB 3.2.15和python以及pymongo驱动程序。 我使用批量方法插入的文档类似于以下内容: { "_id" : ObjectId("59d7d59bf1566a1f541d42d5"), "monitor" : 5, "tiempo" : 1, "senial1" : { "0" : 0.164844, "1" : 0.3255

我正在Ubuntu服务器14.04 64位操作系统上使用MongoDB 3.2.15和python以及pymongo驱动程序。 我使用批量方法插入的文档类似于以下内容:

{
   "_id" : ObjectId("59d7d59bf1566a1f541d42d5"),
   "monitor" : 5,
   "tiempo" : 1,
   "senial1" : {
                 "0" : 0.164844,
                 "1" : 0.325524
               }
   "senial2" : {
                 "0" : 0.569832,
                 "1" : 0.128563
               }
}
每批插入100份此类文件。当一个块的执行结束时,另一个块开始执行。执行43200个批量,因此我总共插入了4320000个文档

由于我使用一个分片的集群作为测试,所以执行相同的过程两次。 我第一次使用散列切分键作为字段id。 第二次我使用复合碎片键,用于monitor和tiempo字段

我的问题: 执行完43200块后,我立即使用count()方法查看是否所有文档都已正确插入。当我使用复合碎片键时,我得到了正确的结果:4320000个文档。但当我使用shard键散列时,结果是4328872个文档。几分钟后,我重新使用count()方法,这次文档的数量是正确的。 为什么“计数”方法计算的文档比我插入的文档多?为什么一种类型的键会出现这种行为,而另一种类型的键却没有

多谢各位


注意:我的集群有2个碎片副本集。

哈希键比复合键分布更均匀,尤其是基数较低的键

Balancer在某个时候开始迁移块,所以在迁移过程中两个碎片上都有相同的文档


相关文档对幕后发生的事情有很好的解释。

嗨,Alex Blex。谢谢你的回答,但我还是不明白(我倒着理解)。我阅读了文档,了解到如果使用散列键,文档的分布比使用复合键更均匀。所以如果他们分布得更好。。。为什么会有更多的迁移?应该少一点吗?嗯,从来没有这样想过。我的理由是,更均匀分布的块应该同时达到分割大小,平衡器应该开始将它们全部洗牌,从而产生明显的重复。对于复合键,拆分/迁移应该更早开始,因此在导入结束时不会有太多的块需要拆分,但您的解释实际上是有意义的。如果您想知道幕后到底发生了什么,可以尝试在导入期间记录
sh.status()
,以检查数据分区的动态。