在MongoDB中,如何只返回数组的一部分?
考虑集合“水果”,我在其中有这个文档(顺便说一句,我正在使用Python的pymongo驱动程序): 现在,如果我只想获取“国家”字段,这个查询就可以了:在MongoDB中,如何只返回数组的一部分?,mongodb,pymongo,Mongodb,Pymongo,考虑集合“水果”,我在其中有这个文档(顺便说一句,我正在使用Python的pymongo驱动程序): 现在,如果我只想获取“国家”字段,这个查询就可以了: In [1]: find_one('lemons', { 'countries' : 1, '_id' : 0 }) Out[1]: {u'countries': [u'Mexico', u'Turkey', u'Argentina', u'SAfrica', u'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}
嗯,国家的数量已经减少了,但现在它给了我很多其他不相关的信息
Q:有没有办法只显示我要求的字段?另外,将“\u id”列为异常是可以的,因为这个字段总是显示的,但我不能确定其他字段,因为MongoDB是无模式的,如果需要的话,我打算使用这个功能添加额外的字段。这很奇怪,因为在mongo控制台中运行时不是这样的行为 您是否尝试过将
'lemons'
放在大括号中,以使其成为有效的JSON语法
find_one({'_id':'lemons'}, { 'countries' : 1, '_id' : 0 })
在我看来,它似乎将$slice投影应用于所有字段,因此pymongo驱动程序可能存在一些奇怪的语法问题您尝试过添加另一个包含投影吗?我认为您可以添加一些琐碎的东西,比如foo:1(这不是一个真正的字段),它应该可以工作 像这样:
{ 'countries' : { '$slice' : [0, 3] }, '_id' : 0, foo : 1 }
如果它不起作用,我建议向mongo提交一个bug。它们实际上非常擅长响应bug。
查找一个({u id':'lemons'),{'countries':{'slice':[0,3]},{u id':0})
给出了与前面提到的相同的结果,我将测试它在mongo shell中的工作方式。不幸的是,mongo shell也给出了相同的结果。我正在运行MongoDB的2.2.3版本,如果这有关系的话。看起来这是出于设计,是一个已知的问题:。您必须明确地抑制所有其他字段,但正如您所解释的,如果您添加到动态schemaOk中,您不一定知道所有字段,我想最好将\u id:0
更改为\u id:1
,这样MongoDB只返回切片数组加上id字段,这至少是可预测的。哇,这似乎很有效!是什么让你想到添加另一个“虚拟”字段的?我在mongo上做了很多工作,似乎总是有一个解决方案可以让他们的代码按预期工作=pThanks,这是一个很棒的(如果出乎意料的话)解决方案。我真不敢相信没有比这更正式的解决方案了。。。?当我读到关于$slice的文章时,我问了自己和OP一样的问题。这是在读了关于限制域的文章两秒钟后,因为这两篇文章是…Holyshit,我面临着同样的问题,这不是pymongo的一个bug吗?我不敢相信这个错误今天仍然存在。
{ 'countries' : { '$slice' : [0, 3] }, '_id' : 0, foo : 1 }