Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
更新MongoDB范围碎片上的标记范围_Mongodb_Sharding - Fatal编程技术网

更新MongoDB范围碎片上的标记范围

更新MongoDB范围碎片上的标记范围,mongodb,sharding,Mongodb,Sharding,假设我使用range标记为碎片设置了一个最小和最大关键点。之后,我发现我定义的标记范围将不平衡。然后我必须更改标记范围值 我在MongoDB文档中搜索过,它只提到添加和删除标签,没有提到更新/更改标签范围值 然后我通过更新db config集合shard中的值来做一些实验 mongos> db.tags.find() { "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range",

假设我使用range标记为碎片设置了一个最小和最大关键点。之后,我发现我定义的标记范围将不平衡。然后我必须更改标记范围值

我在MongoDB文档中搜索过,它只提到添加和删除标签,没有提到更新/更改标签范围值

然后我通过更新db config集合shard中的值来做一些实验

mongos> db.tags.find()
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 100 }, "tag" : "rangeTime1" }
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "ns" : "test.lab.range", "min" : { "_id" : 100 }, "max" : { "_id" : 200 }, "tag" : "rangeTime2" }
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 100 } }},{$set:{min : {_id : 150}}})
mongos> db.tags.update({_id:{ "ns" : "test.lab.range", "min" : { "_id" : 1 } }},{$set:{max : {_id : 150}}})
mongos> db.tags.find()
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 1 } }, "ns" : "test.lab.range", "min" : { "_id" : 1 }, "max" : { "_id" : 150 }, "tag" : "rangeTime1" }
{ "_id" : { "ns" : "test.lab.range", "min" : { "_id" : 100 } }, "max" : { "_id" : 200 }, "min" : { "_id" : 150 }, "ns" : "test.lab.range", "tag" : "rangeTime2" }
它工作得很好,但是标签id没有更新。请注意,即使在rangeTime2将min更新为150,id也不会更新,这使得标记集合看起来不一致

它有点脏,但可悲的是它是工作


这是更新标记范围的正确方法吗?还有其他更好的方法吗?

这并不明显,但是如果您使用相同的最小值(在您的情况下为1或100)和不同的最大值运行
sh.addTagRange()
,那么具有该最小值的现有标记范围将发生变化,基本上起到就地更新的作用(the
addTagRange())
helper基本上是基于_id字段并进行一些健全性检查)运行的,可以通过不使用括号运行它来查看:

mongos> sh.addTagRange
function ( ns, min, max, tag ) {
    if ( bsonWoCompare( min, max ) == 0 ) {
        throw new Error("min and max cannot be the same");
    }

    var config = db.getSisterDB( "config" );
    config.tags.update( {_id: { ns : ns , min : min } } ,
            {_id: { ns : ns , min : min }, ns : ns , min : min , max : max , tag : tag } ,
            true );
    sh._checkLastError( config );
}
要更改最小标记范围,这将不起作用-您需要删除并重新添加,或者需要手动更新子文档中的
\u id.min
字段以及顶级文档中的
min
字段,以避免出现不一致。我建议当前使用删除并重新添加选项,以避免混淆。这些命令将在以后的版本(尚未计划)中进行重构,我个人添加了一个新的remove helper作为的一部分,以使其在将来变得不那么繁重。

这也是一个需要解决的问题