2016-11-16 2 views
0

У меня есть некоторые данные, хранящиеся в моей коллекции, вот пример, полученный через оболочку. (Просьба игнорировать язык текста.)Python2.7 - Как прочитать определенное поле в коллекции MongoDB

{ 
    "_id" : ObjectId("581ab1811d41c814004f4d16"), 
    "created_time" : "2016-11-02T19:48:41+0000", 
    "message" : "Acabaram de assaltar o carro de um colega nosso em Itabaiana\nno zangue, ele é de Aracaju e foi passear em Itabaiana.Gol G6 prata 2013 placa OER-5474.\n", 
    "id" : "400728540046889_1107668596019543" 
} 

В этом случае мне нужно получить только текст, содержащийся в "message" поле, так как мне нужно сделать несколько операций в этих текстах. Таким образом, процесс будет следующим: в моей коллекции я должен получить весь текст в поле "message", выполнив операции, а затем верну его "message" в соответствующее место, а также другие его атрибуты. Мой код до сих пор:

# -*- coding: utf-8 -*- 
import preprocessing 
import pymongo 
import json 
from pymongo import MongoClient 
from unicodedata import normalize 
from preprocessing import PreProcessing 


if __name__ == '__main__': 
    client = MongoClient('localhost:27017') 
    collection = client.facebook.dadosColetados1 
    try: 
     dbmessage = collection.find() 
     for text in dbmessage: 
      print text 
    except Exception, e: 
     print str(e) 

Я не могу передать атрибут "message" для использования в находке и, когда я использую только find() он возвращает мне текст, не будучи в UTF-8, как:

e7\xf5es institucionais para uma seguran\xe7a p\xfablica mais integrada em todo o Estado.\n\nO secret\xe1rio destacou a import\xe2ncia da manuten\xe7\xe3o do di\xe1logo entres as institui\xe7\xf5es. 

Какой был бы лучший подход к этой ситуации?

Редактировать 1: Решение, предложенное @ jcmetz21 работает.

+1

Не могли бы вы дать нам только минимальный рабочий пример? Я быстро взглянул и пришел к выводу, что 95% этого кода не связано. Отважные молодые души могут быть вновь проснувшись и встать на задание, но ленивые усталые задницы вроде меня подумают, что было бы неплохо не удалять 95% кода, чтобы проверить его локально, если это возможно. – Torxed

+0

какая версия python вы используете? python 3: вы можете изменять сообщения в структуру 'bytes', а затем декодировать его как« latin-1 ». который будет печатать португальские (?) символы. –

+0

@Torxed Я сказал, что хотел бы знать, как использовать только данные, содержащиеся в поле в коллекции монго. Получив эти данные, выполните некоторые операции и верните их другим персетентам данных. Я привел пример того, как эти данные хранятся в банке, привел пример того, как я это сделал, чтобы читать и извлекать эти данные. Только я не могу вернуть один текст за раз. –

ответ

1

Вы можете запросить базу данных и установить проекцию так, чтобы возвращалось только поле значений, связанное с ключом «сообщение». Затем переместите сообщения в список.

import pymongo 

client = pymongo.MongoClient('localhost:27017') 
db = client['db_name'] 

query = {'message': {'$exists': 1}} 
projection = {'_id': 0, 'message': 1} 

data = list(db['collection_name'].find(query, projection)) 

message_list = [] 
for message in data: 
    for key, value in message.iteritems(): 
     message_list.append(value) 

Теперь «message_list» будет содержать все сообщения из вашей коллекции, и вы можете выполнить любую операцию на ваших данных:

message_list = [u'message1', u'message2', u'message3', etc.] 

EDIT # 2 (изменения примечание выше): Если вы хотите сохраните идентификатор и временную метку, связанную с ее соответствующим сообщением, вы можете сделать следующее ...

В projetion установите ключ «id» и «created_time» в 1 («id»: 1, «created_time»: 1) и изменить код сверху:

message_list = [value for dict in data for key, value in dict.iteritems() if key == 'message'] 
id_list = [value for dict in data for key, value in dict.iteritems() if key == 'id'] 
timestamp_list = [value for dict in data for key, value in dict.iteritems() if key == 'created_time'] 

# to print all of your messages 
for message in message_list: 
    print message 

Теперь вы можете видеть все свои сообщения и делать с ними то, что хотите, независимо от того, обновляете ли они все сообщения через итерацию или обновляете несколько сообщений, хотя индексируете.

Затем вы можете соединить все 3 списка, чтобы вы знали, какие данные связаны с чем.

pair_up = zip(message_list, id_list, timestamp_list) 

for x, y, z in pair_up: 
    print "The message " + x + " has id " + y + " and timestamp " + z 
+0

Почему вы используете' find() ', если я хочу создать список« сообщений »в конце дня?» – styvane

+1

Потому что сначала вам нужно найти все документы в базе данных/collection, содержащий ключ «сообщение». Или, если вы хотите найти какое-то конкретное сообщение, вы тоже можете это сделать, обновив поле запроса. –

+0

И, в конце концов, я могу сказать, что говорят, что сообщение 1 принадлежит id x и так далее? –

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