2012-04-20 15 views
0

私はmongodbのつぶやきのコレクションにあるすべてのハッシュタグを集めようとしています。そして、各ハッシュタグがつぶやきに何回出現するかを数えたいと思います。 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"にない場合にのみ、 "count"の値をインクリメントする方法を探しています。しかし、私は2つ以上のクエリを使用してそれを行う方法を理解して以来、私は1つのクエリでそれをしたい。これが不可能な場合は、私は2つ以上のクエリでそれに行くように教えてください!ありがとう:D

答えて

3

考えられる解決策の1つは、問題のツイートが「ツイートイド」配列にまだ存在していないことを確認するためにクエリ文書を変更することです。一致する場合、照会は一致せず、更新は実行されません。

JSシェルを使用した例です。サンプル文書なしで正確な答えを出すことは難しいので、私はあなたの文書構造を推測しました。うまくいけば、それは十分に近いので、例はあなたに関連しています。次の更新は、更新が再度実行される場合、「カウント」がないであろう

> 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」配列に「ID1」を追加し、「1カウント」の値をインクリメントする

> db.hcoll.save({_id:1, hashtag:"myHashTag", count:0, tweetsid:[]}) 
> db.hcoll.find() 
{ "_id" : 1, "hashtag" : "myHashTag", "count" : 0, "tweetsid" : [ ] } 

クエリの一部が一致しないため、増分してください。私はあなたはそれが存在しない場合に作成される文書をたいていることを示す、真のアップサート=でアップデートを実行しているあなたのポストから見

> 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" ] } 
> 

。残念ながら、新しい "tweetsid"値が "tweetsid"配列にある場合、クエリは一致せず、upsertによって新しい文書が作成されるため、私が提示した更新は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

これは非常に役に立ち、あなたは私にそのやり方を教えてくれました!ありがとう! –

1

しかし、私は2つ以上のクエリを使用してそれを行う方法を理解しているので、それは1つのクエリで欲しいです。これができない場合は教えてください...

これはできません。

実際、私はさらに進んで、here is the JIRA ticketに行きます。そこにJIRAで投票することができます。

関連する問題