考虑收集“水果”,其中我有这个文件(我使用的是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是无方案的,我打算使用此功能在需要时添加其他字段。
答案 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驱动程序的一些奇怪的语法问题