考えられる解決策の 1 つは、クエリ ドキュメントを変更して、問題の tweetid がまだ「tweetsid」配列にないことをアサートすることです。そうである場合、クエリは一致せず、更新は実行されません。
JS シェルを使用した例を次に示します。ドキュメントの例がないと正確な答えを出すのは難しいので、ドキュメントの構造を推測しました。うまくいけば、それは十分に近いので、例はあなたに関連しています.
> db.hcoll.save({_id:1, hashtag:"myHashTag", count:0, tweetsid:[]})
> db.hcoll.find()
{ "_id" : 1, "hashtag" : "myHashTag", "count" : 0, "tweetsid" : [ ] }
次の更新では、「id1」を「tweetsid」配列に追加し、「count by 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" ] }
{tweetsid:{$ne:"id1"}}
再度更新すると、クエリの一部が一致しない ため、「count」はインクリメントされません。
> 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=true で更新を実行していることがわかります。これは、ドキュメントが存在しない場合は作成することを示しています。残念ながら、私が提示した更新は 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" ] }
>
上記がいくつかのアイデアを提供し、解決策を見つけるのに役立つことを願っています.