2017-02-07 6 views
1

У меня есть таблица Монго, которая выглядит следующим образом:Получить различные уровни поля массива в 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» фактор? Я использую pymongo как свой ORM, поэтому любой синтаксический сахар, который он поддерживает для такого типа запросов, является бонусом.

+0

Проблема заключается в том, что эти значения массивов. Если бы у вас было бы что-то вроде '[[1, 0]]', то 'db.woohoo.distinct ('id_pair')' работал бы так, как ожидалось. – Veeram

ответ

2

Вам необходимо запустить агрегатную операцию, которая группирует все документы в целом, а затем создают определенный набор, используя $addToSet следующим образом:

Монго Shell

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

Пример вывода

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

Пример PyMongo работа агрегата

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

 Смежные вопросы

  • Нет связанных вопросов^_^