一个可能的解决方案是修改查询文档以声明所讨论的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