2012-04-20 60 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那裏投票。

相關問題