在MongoDB中如何只返回部分数组?

时间:2013-04-03 20:25:16

标签: mongodb pymongo

考虑收集“水果”,其中我有这个文件(我使用的是Python的pymongo驱动程序,顺便说一句):

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

现在,如果我只想获得'countries'字段,那么这个查询就可以了:

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

但事实证明,我真正需要的只是少数顶级国家的名单,而不是全部,所以我使用“$ slice”代替普通的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是无方案的,我打算使用此功能在需要时添加其他字段。

2 个答案:

答案 0 :(得分:11)

您是否尝试添加其他包含投影?我想你可以添加一些像foo:1(这不是真正的领域)这样的小事,它应该可以工作。

像这样:

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

如果它不起作用,我建议用mongo提交一个bug。他们实际上非常善于应对错误。

答案 1 :(得分:0)

这很奇怪,因为这不是在mongo控制台中运行时的行为。

您是否尝试将'lemons'置于花括号中,以便它是有效的JSON语法?

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

在我看来,它正在将你的$ slice投影应用于所有字段,因此它可能是pymongo驱动程序的一些奇怪的语法问题