一個可能的解決方案是修改查詢文檔以聲明所討論的tweetid不在「tweetsid」數組中。如果是,查詢將不匹配,並且更新將不會執行。
這是一個使用JS shell的例子。沒有示例文檔就很難給出確切的答案,所以我猜測了你的文檔結構。希望它足夠接近,所以這個例子與你有關。
> db.hcoll.save({_id:1, hashtag:"myHashTag", count:0, tweetsid:[]})
> db.hcoll.find()
{ "_id" : 1, "hashtag" : "myHashTag", "count" : 0, "tweetsid" : [ ] }
以下更新將「ID1」添加到「tweetsid」陣列和「由1計數」增加的值
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
如果更新被再次執行,「計數」不會被加1,因爲查詢的{tweetsid:{$ne:"id1"}}
部分不匹配。
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
>
我從您的文章,你是執行與UPSERT =真正的更新看,表示你想,如果它不存在,要創建的文檔。不幸的是,我提交的更新不能用於upsert,因爲如果新的「tweetsid」值位於「tweetsid」數組中,查詢將不匹配,並且upsert將創建一個新文檔。
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}}, true, false)
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
{ "_id" : ObjectId("4f91ae48f48744310eab90d2"), "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
>
希望以上內容能爲您提供一些建議並幫助您找到解決方案。
這是非常有用的,你給了我想法如何做到這一點!謝謝! – 2012-04-20 23:01:40