Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB中,如何只返回数组的一部分?_Mongodb_Pymongo - Fatal编程技术网

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

在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']} 但事实证明,我真正需要的只是列出几个排名靠前的国家,而不是所有国

考虑集合“水果”,我在其中有这个文档(顺便说一句,我正在使用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']}
但事实证明,我真正需要的只是列出几个排名靠前的国家,而不是所有国家,所以我使用“$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 }