2014-11-20 4 views
0

У меня есть следующий код в Python:Как использовать mapreduce в mongodb?

from pymongo import Connection 
import bson 

c = Connection() 
db = c.twitter 

ids = db.users_from_united_states.distinct("user.id") 

for i in ids: 
    count = db.users_from_united_states.find({"user.id":i}).count() 
    for u in db.users_from_united_states.find({"user.id":i, "tweets_text": {"$size": count}}).limit(1): 
    db.my_usa_fitness_network.insert(u) 

Мне нужно, чтобы получить все пользователи и найти реестр каждого пользователя, где число tweets_text равно числу раз, когда он появляется в коллекции (это означает, что этот документ содержит ВСЕ твиты, которые опубликовал один и тот же пользователь). Затем мне нужно сохранить его в другой коллекции или просто сгруппировать в одну коллекцию.

Когда я запускаю этот код он дает мне ряд документов, которые меньше, чем ids числа

Я видел кое-что о MapReduce, но я просто не могу понять, как использовать его в моем случае.

Я попытался запустить другой код непосредственно на MongoDB, но он не работал вообще:

var ids = db.users_from_united_states.distinct("user.id") 

for (i=0; i< ids.length; i++){ 
    var count = db.users_from_united_states.find({"user.id":ids[i]}).count() 
    db.users_from_united_states.find({"user.id":ids[i], "tweets_text": {$size: count}).limit(1).forEach(function(doc){db.my_usa_fitness_network.insert(doc)}) 
} 

Можете ли вы помочь мне, пожалуйста? У меня огромный проект, и мне нужна помощь. Спасибо.

+0

db.collection.find() и db.collection.count() являются асинхронными. Непосредственно на mongo (javascript) вам нужно использовать обратный вызов, чтобы дождаться результата для счета, прежде чем делать поиск. – joao

+0

Я сохраняю значение count() в переменной, а затем выполняю поиск() ... –

+0

, если моя догадка правильная, вы хотите, чтобы каждый пользователь и его счетчик твитов, ryt? – Ninad

ответ

1
[ 
    { 
     "$group": { 
      "_id": "$user.id", 
      "my_fitness_data": { 
       "$push": "$text" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "UserId": "$_id", 
      "TweetsCount": { 
       "$size": "$my_fitness_data" 
      }, 
      "Tweets": "$my_fitness_data" 
     } 
    } 
    ] 
+0

Привет, спасибо за ответ, но это не то, что я ищу. Мне нужно сгруппировать все твиты каждого пользователя. Я нашел этот код, и он работает, но мне нужно сохранить его в другой коллекции, знаете ли вы, как я могу это сделать? 'db.users_from_united_states_bkp_1.aggregate ([{$ group: {_id:" $ user.id ", my_fitness_data: {$ push:" $ text "}}}])' –

+0

Я решил проблему с $ . Спасибо вам большое за ваше время! –

+2

это хорошо !! Я отредактировал ответ так, чтобы он помогал другим, кто смотрел эту тему – Ninad

Смежные вопросы