測試數據:{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" :
"ABC",
"comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane",
"votes" : 7 } ] }執行更新語句:語句一:db.mydb.update({title:"ABC"}, {$inc:{"comments.$.votes":1}}, 0, 1)執行報錯:Cannot apply the positional operator without a corresponding query field containing an array.語句二:db.mydb.update({"comments.by":"joe"}, {$inc:{"comments.$.votes":1}}, 0, 1)
2 回答

holdtom
TA貢獻1805條經驗 獲得超10個贊
"comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ]
這里 comments 是一個 array (見報錯信息),如果要更新的話需要遍歷

江戶川亂折騰
TA貢獻1851條經驗 獲得超5個贊
comments是一個array,但是不用遍歷。樓主用的"$"就是解決辦法。只是用錯了。來看一下$到底什么意思。
update的前兩個參數<查詢條件>和<更新操作>中,如果你在<查詢條件>中查詢的內容是array里的內容,<更新操作>中就可以使用"$"來引用前查詢中匹配到的元素。
你的第二個例子就是在查詢一個array。在第一個例子里,你找到了title="ABC"
的doc, 這里匹配查詢條件的不包含array. 實際上,你可以把兩個例子中的的查詢條件寫在一起,查詢 title="..."
,同時有Joe留言的那個doc, 然后,把找到的這個Joe的留言的投票+1.
- 2 回答
- 0 關注
- 236 瀏覽
添加回答
舉報
0/150
提交
取消