不包含模式 {_id:hashed} 的 _id 或分片键
Does not contain _id or shard key for pattern {_id:hashed}
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 个文档. (multi: false
)
考虑一下,当您进行不包含分片键的查询时,mongodb 必须将查询分散到所有分片,因为 mongos
无法确定哪个分片文件可能在分片上。
因此,如果 mongos
将您的查询广播到所有分片,其中两个或更多分片可能会找到与您的查询匹配的文档,并且它们都会更新找到的文档。这会违反您的 {multi: false}
.
现在也许你知道bookId
是一个唯一标识符,但你的mongodb集群不知道.您是否有机会用 _id
替换 bookId
?也就是说,您能否更改文档,使其具有 _id: "123461"
而不是 bookId
字段?或者如果您知道 bookId
是唯一的,您可以设置 multi: true
。虽然这不是一个有效的操作,因为命令必须发送到所有分片,即使文档只在其中一个分片中。
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 个文档. (multi: false
)
考虑一下,当您进行不包含分片键的查询时,mongodb 必须将查询分散到所有分片,因为 mongos
无法确定哪个分片文件可能在分片上。
因此,如果 mongos
将您的查询广播到所有分片,其中两个或更多分片可能会找到与您的查询匹配的文档,并且它们都会更新找到的文档。这会违反您的 {multi: false}
.
现在也许你知道bookId
是一个唯一标识符,但你的mongodb集群不知道.您是否有机会用 _id
替换 bookId
?也就是说,您能否更改文档,使其具有 _id: "123461"
而不是 bookId
字段?或者如果您知道 bookId
是唯一的,您可以设置 multi: true
。虽然这不是一个有效的操作,因为命令必须发送到所有分片,即使文档只在其中一个分片中。