2013-04-03 2 views
4

Рассмотрим коллекции «фрукты», в котором у меня есть этот документ (я использую драйвер PyMongo Питона, кстати):В MongoDB как вернуть только часть массива?

{ 
    '_id'  : 'lemons', 
    'weight' : 58, 
    'shape'  : 'oval', 
    'countries' : ['Mexico', 'Turkey', 'Argentina', 'SAfrica', 'US'] 
} 

Теперь, если я хочу, чтобы получить только поле "стран, этот запрос работает просто отлично:

In [1]: find_one('lemons', { 'countries' : 1, '_id' : 0 }) 
Out[1]: {u'countries': [u'Mexico', u'Turkey', u'Argentina', u'SAfrica', u'US']} 

Но оказывается, что то, что мне действительно нужно просто список из немногих топ-стран, не все из них, поэтому я использую «$ срез» вместо обычного True/1:

In [239]: c.find_one('lemons', { 'countries' : { '$slice' : [0, 3] }, '_id' : 0 }) 
Out[239]: 
{u'countries': [u'Mexico', u'Turkey', u'Argentina'], 
u'shape': u'oval', 
u'weight': 58} 

Ну, число стран сократилось, но теперь это дает мне много другой несвязанной информации!

Вопрос: Есть ли способ показать только те поля, которые я просил? Кроме того, исключение «_id» в качестве исключения прекрасное, поскольку это поле всегда представлено, но я не могу быть уверен в других полях, поскольку MongoDB не имеет схемы, и я намерен использовать эту функцию для добавления дополнительных полей, если это необходимо.

ответ

11

Вы пытались добавить еще одну проекцию включения? Я думаю, вы можете добавить что-то тривиальное, как foo: 1 (это не настоящее поле), и он должен работать.

Как так:

{ 'countries' : { '$slice' : [0, 3] }, '_id' : 0, foo : 1 } 

Если он не работает, я предлагаю подав ошибка с Монго. Они на самом деле очень хорошо реагируют на ошибки.

+0

Ничего себе, это похоже на работу! что заставило вас подумать о добавлении еще одного «фиктивного» поля? – Brad

+0

Я много сделал с монго, и всегда кажется, что это временное решение, чтобы заставить их работать как ожидалось = p –

+4

Спасибо, это потрясающее (если неожиданное) решение. –

0

Это странно, потому что это не поведение при работе в консоли mongo.

Вы пробовали поставить 'lemons' в фигурные скобки, так что это действительный синтаксис JSON?

find_one({'_id':'lemons'}, { 'countries' : 1, '_id' : 0 }) 

Он смотрит на меня, как это применяя свой $ ломтика проекцию на все поля, так что это может быть какой-то странный вопрос синтаксиса с драйвером PyMongo

+0

'find_one ({'_ id': 'lemons'}, {'countries': {'$ slice': [0,3]}, '_id': 0})' дает тот же результат, что и упомянутый, I Я проверю, как это работает в оболочке монго. –

+0

Mongo shell дает мне такой же результат, к сожалению. Я использую версию 2.3.3 MongoDB, если это имеет значение. –

+1

Похоже, что это по дизайну и является известной проблемой: https://jira.mongodb.org/browse/SERVER-3378. Вам придется явно скрывать все остальные поля, но, как вы объяснили, вы не обязательно будете знать их все, если вы добавите динамическую схему – Brad

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