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
答案 0 :(得分:18)
原因是因为您处于分片群集中,并且您正在使用既不唯一也不是分片键的索引来识别要更新的文档,但是您已指定只需要更新1个文档。 (multi: false
)
当您进行不包含分片键的查询时,mongodb必须将查询分散到所有分片,因为mongos
无法确定文档可能位于哪个分片上
因此,如果mongos
将您的查询广播到所有分片,则其中的两个或多个可能会找到与您的查询匹配的文档,并且它们都会更新他们找到的文档。这会违反您的{multi: false}
。
现在或许 你 知道bookId
是唯一标识符,但你的mongodb群集却没有。您是否有可能将bookId
替换为_id
?也就是说,您是否可以更改文档,使其不是bookId
字段,而是_id: "123461"
?或者,如果您知道bookId
是唯一的,则可以设置multi: true
。虽然它不是一个有效的操作,因为即使文档只在其中一个中,也必须将命令发送到所有分片。