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

但是如果对相同的推文第二次执行此代码,那么即使没有第二次将 tweetid 添加到数组中,计数器“count”也会增加。

我正在寻找一种仅在 tweetid 不在数组“tweetsid”中时才增加“count”值的方法。但是我想要一个查询,因为我了解如何使用两个或更多查询来完成它。如果这是不可能的,请告诉我,所以我只需要两个或更多查询就可以了!感谢:D

4

2 回答 2

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”数组中,并将“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" ] }

如果再次执行更新,“count”将不会增加,因为{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=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

但是我想要一个查询,因为我了解如何使用两个或更多查询来完成它。如果这不可能,请告诉我......

这是不可能的。

其实我会更进一步,这里是 JIRA 票。你可以在 JIRA 那里投票。

于 2012-04-20T18:33:19.930 回答