不包含模式 {_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。虽然这不是一个有效的操作,因为命令必须发送到所有分片,即使文档只在其中一个分片中。