问题描述
测试数据:
{ '_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)
执行结果正常
请问是怎么回事?
问题解答
回答1:'comments' : [ { 'by' : 'joe', 'votes' : 3 }, { 'by' : 'jane', 'votes' : 7 } ]
这里 comments 是一个 array (见报错信息),如果要更新的话需要遍历
回答2:楼上说的没错,comments是一个array,但是不用遍历。楼主用的'$'就是解决办法。只是用错了。来看一下$到底什么意思。
update的前两个参数<查询条件>和<更新操作>中,如果你在<查询条件>中查询的内容是array里的内容,<更新操作>中就可以使用'$'来引用前查询中匹配到的元素。
你的第二个例子就是在查询一个array。在第一个例子里,你找到了title='ABC'的doc, 这里匹配查询条件的不包含array. 实际上,你可以把两个例子中的的查询条件写在一起,查询,同时有Joe留言的那个doc, 然后,把找到的这个Joe的留言的投票+1.

