2012-04-20 3 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 не добавляется во второй раз в массив, то счетчик «счетчик» увеличивается.

Я ищу способ увеличить значение «count» только в том случае, если tweetid не находится в массиве «tweetsid». Но я хочу это с одним запросом, так как я понимаю, как это сделать, используя два или более запросов. Если это невозможно, скажите мне, чтобы я просто пошел на это с двумя или более вопросами! Спасибо: D

ответ

3

Одним из возможных решений является изменение документа запроса, чтобы утверждать, что данный твитид еще не находится в массиве «tweetsid». Если это так, запрос не будет соответствовать, и обновление не будет выполнено.

Вот пример использования оболочки JS. Трудно дать точный ответ без примерного документа, поэтому я догадался о структуре вашего документа. Надеюсь, это достаточно близко, поэтому пример вам подходит.

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

Если обновление выполняется снова, «рассчитывать» не будет быть увеличено, потому что часть запроса {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" ] } 
> 

Надеемся, что вышеизложенное предоставит вам некоторые идеи и поможет вам найти решение.

+0

Это было очень полезно, и вы дали мне идею, как это сделать! Благодаря! –

1

Но я хочу его с одним запросом, так как я понимаю, как это сделать, используя два или более запросов. Если это невозможно, сообщите мне об этом ...

Это невозможно.

Фактически, я сделаю еще один шаг, here is the JIRA ticket. Вы можете проголосовать за него в JIRA.