2017-03-28 27 views
0

'colname'フィールドの値を持つ配列を取得する必要があります。 Cursorを返すことはできません。値の配列だけです。Pymongoクエリから文字列を取得

カーソルをループすることなくこの配列を照会する方法はありますか?私はこれが処理リソースの無駄だと感じています。

は今、私はこれをやっている:

from pymongo import MongoClient 

client = MongoClient('mongodb://localhost:27017/') 
headers = client['headers'] 

entomo = headers.entomo 

entomo_data = entomo.find() 
entomo_array = [] 
for data in entomo_data: 
    entomo_array.append(data['colname']) 

は、その後、私はentomo_arrayを返します。

+0

[PyMongoとのtoArray()メソッド(http://stackoverflow.com/questions/8723613/pymongo-and-toarray-method) –

+0

@VinceBowdrenの可能性のある重複これが有効な重複はありません。 – styvane

答えて

0

'colname'フィールドに異なる値がある場合、または重複する値を気にしない場合は、distinct関数を使用できます。あなたの例:

entomo_array = entomo.find().distinct('colname') 
+0

わかりませんが、これは配列をループするだけでなく、これ以上のリソースを消費すると思います。それじゃない?しかし、私は、ループのようにハッシュマップを使用しなければならないので、O(n)の複雑さを持っていると思います。 –

+0

実行時間については、distinct( 'colname')を実行するとコマンドがmongodbサーバー上で実行され、結果が1つのI/O経由で返されると思いますが、カーソル上でループを実行すると、複数のI/Oを作成する。最後に、フィルタがない場合はコレクションレベルでdistinctコマンドを使用できます。 http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.distinct –

1

は、あなたは単にnextを使用してカーソルを消費し、そこからNone

cursor = entomo.aggregate([ 
    {'$group': { 
     '_id': None, 
     'data': {'$push': '$colname'} 
    }} 
]) 

でドキュメントをINGの$groupによって.aggregate()方法でこれを行うことができます。

entomo_array = next(cursor)['data'] 

しかし、「COLNAME」は、コレクション内で一意であれば、あなたは、単にdistinctメソッドを使用することができます。

entomo_array = entomo.distinct('colname') 
関連する問題