gpt4 book ai didi

perl - : "Can' t modify shard key's value fieldid for collection: foo. foo"在 MongoDB-Perl 中是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 13:25:08 24 4
gpt4 key购买 nike

我将 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 },
);

我得到了这个异常(exception):

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

但是当我改为这样分片时:

# '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”

为什么我不能做一个 upsert 设置“id”,有或没有前 2 个示例中所示的修饰符?

在任何一种情况下,插入都可以正常工作。引发异常的是 upsert。

最佳答案

两件事:

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

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

有意义吗?

关于perl - : "Can' t modify shard key's value fieldid for collection: foo. foo"在 MongoDB-Perl 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7005604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com