Выбор поля в запросе mongodb с использованием точечной нотации

Здесь я вижу много похожих вопросов, но ни один из них не решил мою проблему.

У меня есть такой документ:

{'_id': ObjectId ('5006916af9cf0e7126000000'), 'data': [{'count': 0, 'alis': 'statsministeren', 'avis': 'Ekstrabladet'}, {'count': 0, 'alis ':' thorning ',' avis ':' Ekstrabladet '}, {' count ': 0,' alis ':' socialdemokratiets formand ',' avis ':' Ekstrabladet '}, {' count ': 0,' alis ': 'lars barfod', 'avis': 'Ekstrabladet'}, {'count': 0, 'alis': 'formand для консервативного детства','avis':'Ekstrabladet'}, {'count': 0,'alis':'s\xf8vndal','avis':'Ekstrabladet'}, {'count': 0,'alis': u 'sf's formand','avis':'Ekstrabladet'}, {'count': 0,'alis':'m\xf6ger','avis':'Ekstrabladet'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Ekstrabladet'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Ekstrabladet'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'Ekstrabladet'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Ekstrabladet'}, {'count': 0,'alis':'statsministeren','avis':'Information'}, {'count': 1,'alis':'thorning','avis':'Information'}, {'count': 0,'alis':'socialdemokratiets formand','avis': "Информатио n'}, {'count': 0,'alis':'lars barfod','avis':'Information'}, {'count': 0,'alis':'formand для консервативного детского сообщества ','avis':'Information'}, {'count': 0,'alis':'s\xf8vndal','avis':'Information'}, {'count': 0,'alis': u"sf's formand",'avis':'Information'}, {'count': 0,'alis':'m\xf6ger','avis':'Information'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Information'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Information'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'Information'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Information'}, {'count': 0, "alis": "statsministeren", "avis": "Berlingske"}, {"count": 0, "alis": "thorning", "avis": "Berlingske"}, {"count": 0,'alis':'socialdemokratiets formand','avis':'Berlingske'}, {'count': 0,'alis':'lars barfod','avis':'Berlingske'}, {'count': 0,'alis':'formand для консервативного детского общества','avis':'Berlingske'}, {'count': 1,'alis':'s\xf8vndal','avis':'Berlingske'}, {'count': 0,'alis': u"sf's formand",'avis':'Berlingske'}, {'count': 0,'alis':'m\xf6ger','avis':'Berlingske'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Berlingske'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Berlingske'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'Berlingske'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Berlingske'}, {'count': 0,'alis':'statsministeren','avis':'JP'}, {'count': 0,'alis':'thorning','avis':'JP'}, {'count': 0,'alis': "socialdemokratiets formand", "avis": "JP"}, {"count": 0, "alis": "lars barfod", "avis": "JP"}, {"count": 0, "alis": 'formand для dek konservative folkeparti','avis':'JP'}, {'count': 0,'alis':'s\xf8vndal','avis':'JP'}, {'count': 0,'alis': u 'sf's formand','avis':'JP'}, {'count': 1,'alis':'m\xf6ger','avis':'JP'}, {'count': 0,'alis':'lars l\xf8kke','avis':'JP'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'JP'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'JP'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'JP'}, {'count': 0,'alis':'statsministeren','avis':'BT'}, {'count': 0,'alis':'thorning','avis':'BT'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'BT'}, {'count': 0,'alis':'lars barfod','avis':'BT'}, {'count': 0,'alis':'formand for дет консервативные folkeparti','avis':'BT'}, {'count': 0,'alis':'s\xf8vndal','avis':'BT'}, {'count': 0,'alis': u"sf's formand",'avis':'BT'}, {'count': 0,'alis':'m\xf6ger','avis':'BT'}, {'count': 0,'alis':'lars l\xf8kke','avis':'BT'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'BT'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'BT'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'BT'}, {'count': 0,'alis':'statsministeren','avis':'Politiken'}, {'count': 0,'alis':'thorning','avis':'Politiken'}, {'count': 0,'alis':'socialdemokratiets formand','avis':'Politiken'}, {'count': 0,'alis':'lars barfod','avis':'Politiken'}, {'count': 0,'alis':'formand for de konservative folkeparti','avis':'Politiken'}, {'count': 0,'alis':'s\xf8vndal','avis':'Politiken'}, {'count': 0,'alis': u"sf's formand",'avis':'Politiken'}, {'count': 0,'alis':'m\xf6ger','avis':'Politiken'}, {'count': 0,'alis':'lars l\xf8kke','avis':'Politiken'}, {'count': 0,'alis':'l\xf8kke rasmussen','avis':'Politiken'}, {'count': 0,'alis':'lederen af ​​danmarks st\xf8rste parti','avis':'Politiken'}, {'count': 0,'alis':'Pia Kj\xe6rsgaard','avis':'Politiken'}],'time':'2012-07-18 12:35:22.241245'}

То есть:

{_objectId : xxx, time: yyy, data :[ 72 similar dicts in this array ]}

Я хочу получить значения из одного из 72 диктов.

Моя первая попытка была чем-то вроде этого:

db.observations.find({'data.avis':'Ekstrabladet', 'data.alis':'thorning'}, {'data.count':1})

Это было бы получить 72 count диктует, когда то, что я действительно хотел, было значением счетчика для массива, который удовлетворяет как avis:ekstrabladetа также alis:thorning (только один массив). Но вместо этого Монго возвращает весь документ.

Я нашел $elemMatch, но получаю тот же результат.

db.observations.find({'data' : {$elemMatch: {'alis':'thorning','avis':'Ekstrabladet'}}},{'data.count':1})

Я думаю, что я мог бы перебрать весь документ в Python (это для приложения колбу), но это не выглядит очень элегантно.

Итак, мой вопрос: как мне достать внутри документа и получить значения из вложенного документа с массивами?

Бонус: поскольку я новичок во всех видах баз данных, я выбрал только mongodb, потому что он казался очень красивым и гибким, и потому что я не работаю с критическими данными. Но мне не нужна масштабируемость, и я мог бы использовать, например, sqlite. Если у вас есть твердое мнение о том, что я использую неправильный инструмент для работы - тогда, пожалуйста, оскорбляйте меня.

1 ответ

Решение

Вы не можете вернуть только выбранный вложенный документ. Вы получите их все. Так что вам придется фильтровать на стороне клиента.

$elemMatch имеет важное значение, однако, в противном случае вы бы не сравнивали avis и alis с одной и той же записью массива (было бы достаточно иметь по одному, каждый из которых совпадает с любым из них, И с ИЛИ в некотором смысле).

Другие вопросы по тегам