当前位置:  开发笔记 > 编程语言 > 正文

是什么:"不能修改sh​​ard key的值fieldid for collection:foo.foo"是指MongoDB-Perl?

如何解决《是什么:"不能修改sh​​ardkey的值fieldidforcollection:foo.foo"是指MongoDB-Perl?》经验,为你挑选了1个好方法。

我有像这样分片的foo.foo集合:

db.runCommand( { shardcollection: "foo.foo", key: { id: 1 } } );

当我做一些文件时:

$connection->update(
    { id => 42 },
    { '$set' => { id => 42 } },   # using the '$set' modifier
    { upsert => 1, safe => 1 },
);

我得到这个例外:

Can't modify shard key's value fieldid for collection: foo.foo

如果我做一个没有修饰符的upsert:

$result = $collection->update(
    { id => $args{doc_id} },
    { id => 42 },                 # regular upsert without modifier
    { upsert => 1, safe => 1 },
);

我收到此错误:

cannot modify shard key for collection: foo.foo

但是,当我像这样shard时:

# 'id' has been changed to '_id'
db.runCommand( { shardcollection: "foo.foo", key: { _id: 1 } } );

然后,当我执行与上面相同的upsert时,我得到以下异常:

can't upsert something without shard key

什么是"shard key's value fieldid"

为什么我不能使用前两个示例中所示的带有或不带修饰符的"id"进行upsert?

在任何一种情况下,插入工作正常.这是引发异常的讽刺.



1> Remon van Vl..:

两件事情 :

    分片键是不可变的.设置后,无法更新.这是有道理的,因为它会导致数据必须从一个碎片移动到另一个碎片.因此,包含分片键(或属于分片键)的字段的更新将因您收到的错误而失败.前两个错误消息都是相同的错误.

    如果没有分片键,则无法插入分片集合.同样,从mongo的角度来看,这是有道理的.如果您没有提供分片键,它将如何知道应该将哪个分片路由到插入?因此,upsert操作应该包括查找"条件"中的分片键(因此,第一个参数update(criteria, update, upsert, multi)),而不是"更新",因为这是获取分片文档中的分片键的唯一正确方法,而不是在"更新"参数,正如您所注意到的那样,是不允许的.

合理?

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有