2017-02-07 5 views
1

で配列フィールドの異なるレベルを取得します。私はこのようになりますMongoのテーブルを持っているMongoDBの

[ 
    { "_id" : ObjectId("5899d847c014c5287df3819a"), "id_pair" : [ 1, 0 ]}, 
    { "_id" : ObjectId("5899d847c014c5287df3819b"), "id_pair" : [ 2, 0 ] 
] 

私は「id_pair」フィールド、すなわち、すべての異なるレベルを取得するには、テーブルを照会したいと思います:

[ 
    [ 1, 0 ], 
    [ 2, 0 ] 
] 

私はdb.woohoo.distinct('id_pair')を使用してみましたが、それは[0, 1, 2]

「id_pair」因子のすべてのレベルを返す方法はありますが返さ?私はORMとしてpymongoを使用しているので、この種の問い合わせに対してサポートする構文上の砂糖はすべてボーナスです。

+0

をpymongo。 '[[1、0]]'のようなものをペアにすると、 'db.woohoo.distinct( 'id_pair')'は期待通りに動作します。 – Veeram

答えて

2

あなたが集約演算全体としてグループのすべてのドキュメントを実行して、次のように$addToSetを使用して明確なセットを作成する必要があります。

モンゴシェル

db.woohoo.aggregate([ 
    { 
     "$group": { 
      "_id": 0, 
      "distinct_pairs": { "$addToSet": "$id_pair" }     
     } 
    } 
]) 

サンプル出力

{ 
    "_id" : 0, 
    "distinct_pairs" : [ 
     [ 1, 0 ], 
     [ 2, 0 ] 
    ] 
} 

例問題は、これらが配列値であるということである集計操作を

from pymongo import MongoClient 

client = MongoClient('localhost', 27017) 
db = client['somedb'] 
collection = db.woohoo 

pipe = [{'$group': {'_id': 0, 'distinct_pairs': {'$addToSet': '$id_pair'}}}] 

result = next(collection.aggregate(pipeline=pipe))['distinct_pairs'] 
print(result) 
client.close() 
+1

これは完璧です、ありがとう! – duhaime

関連する問題