一种可能的解决方案是修改查询文档以断言所讨论的 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”数组中,并将“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" ] }
如果再次执行更新,“count”将不会增加,因为{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=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" ] }
>
希望以上内容能为您提供一些想法并帮助您找到解决方案。