gpt4 book ai didi

mongodb - 不包含模式 {_id :hashed} 的 _id 或分片键

转载 作者:行者123 更新时间:2023-12-02 03:57:51 24 4
gpt4 key购买 nike

db.books.update({bookId:"123461"},{$set:{"bookPrice":"6.23"}})

我收到错误:

   update { q: { bookId: "123461" }, u: { $set: { bookPrice: "6.23" } }, multi: false, upsert: false } does not contain _id or shard key for pattern { _id: "hashed" }

但是当我在下面使用时它可以工作。

 db.books.update({_id:ObjectId("54b88167498ec382221a82c2")},{$set:     {"bookPrice":"6.23"}})

为什么它不适用于 bookId

最佳答案

原因是因为您位于分片集群上,并且您正在使用既不唯一也不是分片键的索引来标识要更新的文档,但您已指定只想更新 1 个文档。 (多:假)

考虑一下,当您进行不包含分片键的查询时,mongodb 必须将查询分散到所有分片,因为 mongos 无法确定文档位于哪个分片可能已开启。

因此,如果 mongos 将您的查询广播到所有分片,其中两个或多个分片可能会找到与您的查询匹配的文档,并且它们都会更新找到的文档。这会违反您的 {multi: false}

现在也许知道bookId是唯一标识符,但您的mongodb集群不知道。您是否可以将 bookId 替换为 _id?也就是说,您能否更改文档,使其不再具有 bookId 字段,而是具有 _id: "123461" ?或者,如果您知道 bookId 是唯一的,您可以设置 multi: true。尽管这不是一种有效的操作,因为命令必须发送到所有分片,即使文档仅位于其中一个分片中。

关于mongodb - 不包含模式 {_id :hashed} 的 _id 或分片键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27990101/

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