В запросе БД или инструкции python?
Использование питона:
In [21]: d = {"items": [{"id": 1}, {"id": 2}, {"id": 3}]}
In [22]: [i for i in d["items"] if i["id"] == 1]
Out[22]: [{'id': 1}]
(Добавить [0]
в конец списка компе только получить словарь)
Может также использовать генератор:
In [23]: (i for i in d["items"] if i["id"] == 1)
Out[23]: <generator object <genexpr> at 0x052A1D50>
In [24]: _.next()
Out[24]: {'id': 1}
Я бы лично сделайте это выше, так как мы теперь работаем над возвращенной записью из БД.
Если вы хотите извлечь поле непосредственно (при условии, что мы хотим только первый возвращенный документ, который имеет {"id":1}
в нем):
In [35]: class Doc(Document):
...: items = ListField(DictField())
...:
In [36]: newdoc = Doc(items=[{"id":1},{"id":2},{"id":3}])
In [37]: newdoc.save()
Out[37]: <Doc: Doc object>
In [38]: for document in [d for d in Doc.objects(items__id=1).first().items if d["id"]==1]:
...: print document
...:
{u'id': 1}
Извлечение только словарь, который соответствует сложнее, так как поле является фактически список словарей. Вы не сохраняете какую-либо скорость, изменяя запрос, чтобы возвращать только часть поля, которое соответствует, поэтому вместо этого верните полное поле и из python просто возьмите бит, который вы хотите. Такая же скорость и удобство в обслуживании.
К сожалению, я удалил его. – Rohit