4

考虑集合“fruits”,其中我有这个文档(我正在使用 Python 的 pymongo 驱动程序,顺便说一句):

{
    '_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']}

但事实证明,我真正需要的只是几个顶级国家的列表,而不是全部,所以我使用“$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 是无方案的,如果需要,我打算使用此功能添加其他字段。

4

2 回答 2

12

您是否尝试过添加另一个包含投影?我认为您也许可以添加一些琐碎的东西,例如 foo:1 (这不是一个真实的字段),它应该可以工作。

像这样:

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

如果它不起作用,我建议向 mongo 提交一个错误。他们实际上非常擅长响应错误。

于 2013-04-03T21:04:01.703 回答
0

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

您是否尝试过放入'lemons'花括号以使其成为有效的 JSON 语法?

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

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

于 2013-04-03T20:45:30.660 回答