模式{_id:hashed}中不包含_id或shard键

Noo*_*yed 8 mongodb

db.books.update({bookId:"123461"},{$set:{"bookPrice":"6.23"}})
Run Code Online (Sandbox Code Playgroud)

我收到错误:

   update { q: { bookId: "123461" }, u: { $set: { bookPrice: "6.23" } }, multi: false, upsert: false } does not contain _id or shard key for pattern { _id: "hashed" }
Run Code Online (Sandbox Code Playgroud)

但是当我在下面使用时它起作用.

 db.books.update({_id:ObjectId("54b88167498ec382221a82c2")},{$set:     {"bookPrice":"6.23"}})
Run Code Online (Sandbox Code Playgroud)

为什么它不适用于bookId

NoO*_*let 18

原因是因为您处于分片群集中,并且您正在使用既不唯一也不是分片键来标识要更新的文档,但是您已指定只需要更新1个文档.(multi: false)

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

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

现在也许知道这bookId是一个唯一的标识符,但你的mongodb集群却没有.是否有任何机会,你可以代替bookId_id?也就是说,您是否可以更改文档以使其不具有bookId字段,而是具有_id: "123461"?或者,如果你知道bookId是独特的,你可以设置multi: true.虽然它不是一个有效的操作,因为即使文档只在其中一个中,也必须将命令发送到所有分片.