pymongo Запросить плоский список? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть коллекция с «датчиками», где каждый датчик выглядит следующим образом:

{
    "_id" : ObjectId("5c3bfc66b5594738c8016d12"),
    "parentDeviceID" : ObjectId("5c3b9aa0b559471f1088c5e1"),
    "sn" : 2,
}

Я хотел бы получить список серийных номеров («sn»), которые принадлежат определенному parentDeviceID:

    sensorList = list(self._dbC.sensorsCol.find({'parentDeviceID':parentDeviceID}, {'sn': 1, '_id':0}))
    print(type(sensorList))
    print(sensorList)

Но я получаю список словарей:

[{'sn': 1}, {'sn': 2}, {'sn': 3}]

Я хотел бы получить только:

[1,2,3]

1 Ответ

0 голосов
/ 12 февраля 2019

Вот как вы можете сделать это с помощью агрегации на стороне сервера:

db.sensors.aggregate({"$group":{"_id":null,"sn":{"$push":"$sn"}}})

Это даст вам один документ, подобный следующему:

{ "_id" : null, "sn" : [1, 2, 3] }

Извлекать его тривиальномассив из этого.

$group over _id:null означает, что он создает единую группу для всех документов в коллекции.Агрегатор $push создает массив всех значений sn в этой группе.Имейте в виду, что ограничение размера документа составляет 16 МБ, поэтому, если ваш список идентификаторов датчиков может быть больше этого, вам может потребоваться другое решение на стороне клиента.

...