簡體   English   中英

為什么在嘗試通過pymongo查詢我的mongodb數據庫時會得到一個pymongo.cursor.Cursor?

[英]Why do I get a pymongo.cursor.Cursor when trying to query my mongodb db via pymongo?

我在mongodb數據庫中消耗了一堆推文。 我想用pymongo查詢這些推文。 例如,我想查詢screen_name。 但是,當我嘗試這樣做時,python不會返回一條推文,而是一條關於pymongo.cursor.Cursor的消息。 這是我的代碼:

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

我得到一個JSON,看起來像這樣:

{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'<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>',
 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://a0.twimg.com/profile_background_images/702001815/f87508e73bbfab8c8c85ebe10b29fcf6.png',
  u'profile_background_image_url_https':     u'https://si0.twimg.com/profile_background_images/702001815/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://a0.twimg.com/profile_images/378800000012256721/d8b5f801fb331de6ead4aed42dc77a46_normal.jpeg',
  u'profile_image_url_https':   u'https://si0.twimg.com/profile_images/378800000012256721/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}}

但是,當我嘗試查詢此screen_name時,我得到:

tweets.find({"screen_name": "JoeCatanzarita"})
<pymongo.cursor.Cursor at 0x52c02f0>

然后,當我嘗試計算具有“screen_name”:“name”的推文數量時,我得到:

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

知道我做錯了什么/如何讓pymongo返回我正在尋找的推文?

謝謝!

PyMongo的find()方法返回一個Cursor。 要在服務器上實際執行查詢並檢索結果,請使用list或for循環迭代游標:

for doc in tweets.find({'screen_name': 'name'}):
    print(doc)

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

如果tweets.find({"screen_name": "name"}).count()返回0,則表示沒有文檔與您的查詢匹配。

編輯:既然您已發布示例文檔,我看到您要查詢如下:

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

...因為screen_name字段嵌入在user子文檔中。

我認為問題是“screen_name”是在子文檔中,如果您可以提供我可以幫助您的文檔結構。

好的,我現在看到你的問題:

如果仔細查看文檔,您會注意到“screen_name”位於子文檔用戶中,因此如果您想要訪問它,您只需執行以下操作:

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

每當您遇到要查找的元素位於子文檔中的情況時,例如在這種情況下或在數組內部,總是使用此語法。

我在collection.find()調用時遇到了同樣的問題。

我檢查了對象的類型,它是python dict。 所以我接受了這個詞典,並重復了它,即使只有一個項目,她的工作就像一個魅力。

myResult = db.find({}, {<!-- blah blah blah for the fields you want -->}).sort({"_id":1}).limit(1)
for item in myResult:
    print item

我知道這是很久以前但是我花了一些時間瀏覽這個並且找不到簡單的解釋。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM