¿Por qué obtengo un pymongo.cursor.Cursor al intentar consultar mi db mongodb a través de pymongo?

He consumido un montón de tweets en una base de datos mongodb. Me gustaría consultar estos tweets utilizando pymongo. Por ejemplo, me gustaría consultar por nombre de pantalla. Sin embargo, cuando bash hacer esto, python no devuelve un tweet sino un mensaje sobre pymongo.cursor.Cursor. Aquí está mi código:

import sys import pymongo from pymongo import Connection connection = Connection() db = connection.test tweets = db.tweets list(tweets.find())[:1] 

Me sale un JSON, que se parece a esto:

 {u'_id': ObjectId('51c8878fadb68a0b96c6ebf1'), u'contributors': None, u'coordinates': {u'coordinates': [-75.24692983, 43.06183036], u'type': u'Point'}, u'created_at': u'Mon Jun 24 17:53:19 +0000 2013', u'entities': {u'hashtags': [], u'symbols': [], u'urls': [], u'user_mentions': []}, u'favorite_count': 0, u'favorited': False, u'filter_level': u'medium', u'geo': {u'coordinates': [43.06183036, -75.24692983], u'type': u'Point'}, u'id': 349223725943623680L, u'id_str': u'349223725943623680', u'in_reply_to_screen_name': None, u'in_reply_to_status_id': None, u'in_reply_to_status_id_str': None, u'in_reply_to_user_id': None, u'in_reply_to_user_id_str': None, u'lang': u'en', u'place': {u'attributes': {}, u'bounding_box': {u'coordinates': [[[-79.76259, 40.477399], [-79.76259, 45.015865], [-71.777491, 45.015865], [-71.777491, 40.477399]]], u'type': u'Polygon'}, u'country': u'United States', u'country_code': u'US', u'full_name': u'New York, US', u'id': u'94965b2c45386f87', u'name': u'New York', u'place_type': u'admin', u'url': u'http://api.twitter.com/1/geo/id/94965b2c45386f87.json'}, u'retweet_count': 0, u'retweeted': False, u'source': u'Twitter for iPhone', u'text': u'Currently having a heat stroke', u'truncated': False, u'user': {u'contributors_enabled': False, u'created_at': u'Fri Oct 28 02:04:05 +0000 2011', u'default_profile': False, u'default_profile_image': False, u'description': u'young and so mischievious', u'favourites_count': 1798, u'follow_request_sent': None, u'followers_count': 368, u'following': None, u'friends_count': 335, u'geo_enabled': True, u'id': 399801173, u'id_str': u'399801173', u'is_translator': False, u'lang': u'en', u'listed_count': 0, u'location': u'Upstate New York', u'name': u'Joe Catanzarita', u'notifications': None, u'profile_background_color': u'D6640D', u'profile_background_image_url': u'http://sofes.miximages.com/python/f87508e73bbfab8c8c85ebe10b29fcf6.png', u'profile_background_image_url_https': u'http://sofes.miximages.com/python/f87508e73bbfab8c8c85ebe10b29fcf6.png', u'profile_background_tile': True, u'profile_banner_url': u'https://pbs.twimg.com/profile_banners/399801173/1367200323', u'profile_image_url': u'http://sofes.miximages.com/python/d8b5f801fb331de6ead4aed42dc77a46_normal.jpeg', u'profile_image_url_https': u'http://sofes.miximages.com/python/d8b5f801fb331de6ead4aed42dc77a46_normal.jpeg' , u'profile_link_color': u'140DE0', u'profile_sidebar_border_color': u'FFFFFF', u'profile_sidebar_fill_color': u'E0F5A6', u'profile_text_color': u'120212', u'profile_use_background_image': True, u'protected': False, u'screen_name': u'JoeCatanzarita', u'statuses_count': 6402, u'time_zone': u'Quito', u'url': None, u'utc_offset': -18000, u'verified': False}} 

Sin embargo, cuando bash consultar este nombre de pantalla, obtengo:

 tweets.find({"screen_name": "JoeCatanzarita"})  

Y cuando luego trato de contar el número de tweets que tienen “nombre_de_la pantalla”: “nombre”, obtengo:

 tweets.find({"screen_name": "name"}).count() 0 

¿Alguna idea de lo que estoy haciendo mal / cómo puedo hacer que pymongo devuelva los tweets que estoy buscando?

¡Gracias!

Ok ahora veo cuál es tu problema:

Si observa detenidamente su documento, observará que “screen_name” está dentro del usuario del subdocumento, por lo que si desea acceder, todo lo que tiene que hacer es lo siguiente:

 tweets.find({"user.screen_name": "JoeCatanzarita"}) #for example. 

Siempre que se encuentre en una situación en la que el elemento que está tratando de encontrar se encuentre dentro de un subdocumento como en esta situación o dentro de una matriz, siempre use esta syntax.

El método find () de PyMongo devuelve un Cursor. Para ejecutar la consulta en el servidor y recuperar los resultados, itere el cursor con una list o con un bucle for:

 for doc in tweets.find({'screen_name': 'name'}): print(doc) # Or: docs = list(tweets.find({'screen_name': 'name'})) 

Si tweets.find({"screen_name": "name"}).count() devuelve 0, significa que no hay documentos que coincidan con su consulta.

Editar: ahora que ha publicado un documento de ejemplo, veo que desea consultar como:

 list(tweets.find({'user.screen_name': 'name'})) 

… ya que el campo nombre de screen_name está incrustado en el sub-documento del user .

Creo que el problema es que “screen_name” está dentro de un sub-documento si puede proporcionar la estructura del documento que pueda ayudarle.

Tuve este mismo problema con una llamada collection.find ().

Revisé el tipo de objeto y es el dict de Python. así que tomé el dictado y lo repetí a pesar de que solo había un artículo y ella está trabajando de maravilla.

 myResult = db.find({}, {}).sort({"_id":1}).limit(1) for item in myResult: print item 

Sé que esto fue hace mucho tiempo, pero pasé un tiempo navegando esto y no pude encontrar una explicación fácil.

Espero que esto ayude.