2014-07-04 60 views
4

所以我試圖在Pymongo中使用$ in操作符,我想用一堆MongoID進行搜索。

首先,我有這個疑問找到MongoIDs數組:

findUsers = db.users.find_one({'_id':user_id},{'_id':0, 'f':1}) 

如果我打印它看起來像這樣的findUsers['f']

[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')] 

這些對象ID是用戶ID和我想要的要做的是使用這個ObjectID數組查找用戶集合中的所有用戶。所以我的想法是這樣的:

foundUsers = db.users.find({'_id':{'$in':findUsers['f']}}) 

然而,當我打印foundUsers的結果是這樣的:

<pymongo.cursor.Cursor object at 0x10d972c50> 

這是不是當我打印查詢出來:(

我通常得到我在做什麼錯在這裏?

非常感謝。

也只爲你參考erence,我在mongo shell中查詢過它,它按預期工作:

db.users.find({_id: {$in:[ObjectId('53b2dc0b24c4310292e6def5'), ObjectId('53b6dbb654a7820416a12767')]}}) 

回答

1

您在MongoDB中遇到findOne()和find()之間的區別。 findOne返回單個文檔。 find()返回一個mongoDB遊標。通常你必須遍歷遊標來顯示結果。你的代碼在蒙戈外殼的原因是蒙戈外殼把光標不同,如果他們返回20個文檔或更少 - 它處理遍歷光標爲您提供:

光標

在蒙戈shell,讀取操作的主要方法是db.collection.find()方法 。這種方法查詢一個集合,並且 返回一個光標到返回的文檔。

要訪問文檔,您需要迭代遊標。但是,在 mongo shell中,如果返回的遊標未使用var關鍵字指定給變量 ,那麼遊標會自動迭代至最多 20次[1]以打印到結果中的前20個文檔。

http://docs.mongodb.org/manual/core/cursors/

上遍歷遊標可能會是一個良好的開端的pymongo手冊頁:

http://api.mongodb.org/python/current/api/pymongo/cursor.html

但這裏有一段代碼,應說明你的基礎知識。在您致電查找()後運行此操作:

for doc in findUsers: 
    print(doc) 
+1

非常感謝您的信息!現在我明白了 – jonprasetyo

+0

要將光標一返回就轉換爲Python列表,請將查詢包裝在'list' ...'users = list(db。users.find())' – MFB