0

mongodbのツイートのコレクションにあるすべてのハッシュタグを収集しようとしています。各ハッシュタグがツイートに表示される回数をカウントしたいと思います。hcollは、このコードで作成されたハッシュタグのコレクションです。

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);    

ただし、このコードが同じツイートに対して2回実行されると、ツイートIDが配列に2回追加されなくても、カウンター「カウント」がインクリメントされます。

tweetidが配列「tweetsid」にない場合にのみ「count」の値をインクリメントする方法を探しています。しかし、2つ以上のクエリを使用してそれを行う方法を理解しているので、1つのクエリでそれが必要です。これが不可能な場合は教えてください。2つ以上のクエリでそれを実行します。ありがとう

4

2 に答える 2

3

考えられる解決策の 1 つは、クエリ ドキュメントを変更して、問題の tweetid がまだ「tweetsid」配列にないことをアサートすることです。そうである場合、クエリは一致せず、更新は実行されません。

JS シェルを使用した例を次に示します。ドキュメントの例がないと正確な答えを出すのは難しいので、ドキュメントの構造を推測しました。うまくいけば、それは十分に近いので、例はあなたに関連しています.

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

{tweetsid:{$ne:"id1"}}再度更新すると、クエリの一部が一致しない ため、「count」はインクリメントされません。

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

上記がいくつかのアイデアを提供し、解決策を見つけるのに役立つことを願っています.

于 2012-04-20T18:52:33.597 に答える
1

しかし、2つ以上のクエリを使用してそれを行う方法を理解しているので、1つのクエリでそれをしたい. これが不可能な場合は、その旨をお知らせください...

これは不可能です。

実際、私はさらに一歩進んで、これが JIRA チケットです。JIRA で投票できます。

于 2012-04-20T18:33:19.930 に答える