2012-04-20 58 views
0

我想收集我在mongodb中的推文集合中的所有hashtags,并且我想要计算每个hashtag在推文中出现的次数。 hcoll是使用此代码创建的主题标签集合。在mongodb中的一个对象的数组内计数值

BasicDBObject key = new BasicDBObject("hashtag",hashtagobj.get("hashtag")); 
BasicDBObject update = new BasicDBObject("$addtoSet", new BasicDBObject("tweetsid",hashtagobj.get("_id"))); 
update.put("$inc",new BasicDBObject("count", 1)); 
hcoll.update(key,update,true,false);  

但如果这个代码被执行的第二时间对于相同的鸣叫则即使tweetid未添加第二次到阵列,计数器“计数”被递增。

我正在寻找一种方法来增加“计数”的值,只有当tweetid不在数组“tweetsid”中。但我希望它与一个查询,因为我知道如何使用两个或更多的查询。如果这是不可能的,请告诉我,我只是用两个或两个以上的查询去解决它!谢谢:D

回答

3

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

希望以上内容能为您提供一些建议并帮助您找到解决方案。

+0

这是非常有用的,你给了我想法如何做到这一点!谢谢! – 2012-04-20 23:01:40

1

但我希望它与一个查询,因为我知道如何使用两个或更多的查询。如果这是不可能的,请告诉我...

这是不可能的。

其实我会更进一步,here is the JIRA ticket。你可以在JIRA那里投票。

相关问题