2015-01-16 26 views
4
db.books.update({bookId:"123461"},{$set:{"bookPrice":"6.23"}}) 

我得到的錯誤:不包含_id或碎片鍵模式{_id:哈希}

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

您使用的是分片羣集還是「分片鍵」消息,只是您觸發的錯誤消息的一部分? – NoOutlet

+0

我正在使用分片羣集。爲什麼? –

回答

14

的原因是因爲你是一個分片羣集上,你正在確定你希望與既不是唯一的也不是一個索引更新文件分片鍵,但是您已指定您只想更新1個文檔。 (multi: false

請注意,當您進行不包含分片鍵的查詢時,mongodb必須將查詢分散到所有分片,因爲mongos無法找出文檔可能在哪個分片上。

因此,如果mongos將您的查詢廣播給所有分片,其中兩個或更多分支可能會找到與您的查詢匹配的文檔,並且它們都會更新他們找到的文檔。這會違反你的{multi: false}

現在也許知道bookId是一個唯一的標識符,但您的MongoDB集羣不。有沒有可能用_id代替bookId?也就是說,您可以更改文檔,以便代替bookId字段,它具有_id: "123461"?或者如果您知道bookId是唯一的,您可以設置multi: true。雖然它不是一個有效的操作,因爲即使文檔只在其中一箇中,命令也必須發送到所有的分片。