2011-06-08 76 views
5

我有一个集合与看起来像条目:

{ 
    "userid": 1, 
    "contents": [ 
      { "tag": "whatever", "value": 100 }, 
      {"tag": "whatever2", "value": 110 } 
    ] 
} 

我希望能够在该集合查询和返回数组中只有一个部分:一个与查询匹配。我试图使用$位置运算符来做到这一点,但目前为止还没有成功。

这是更准确,我想做些什么:

collection.find({'contents.tag':"whatever"},{'contents.$.value':1}) 

因此,我期待某物对应的数组中的条目相匹配的查询,这是100在这种情况下,只有价值。

你知道怎么回事吗?我在想,也许$操作符只能用于更新,而不能用于查询。知道的人?

谢谢!

+0

只是为宗旨,以只返回你的价值领域,一个'collection.find({” contents.tag':'whatever'},{'contents.value':1})'就足够了,不需要位置操作符。尽管如此(正如Ryan在他的回答中已经提到的那样),有必要在应用程序端将字段从返回的数组中取出(这也包括文档的'_id')。缺点是,关于嵌套数组的'findOne'或'limit(1)'不起作用,如果您不期望超过1个结果,则这不会成为可能。 – proximus 2011-06-08 16:03:01

回答

8

是的,你是正确的 - 位置操作符用于更新对象。

现在的解决方案是在应用程序中返回数组。

有这个功能的开放增强请求(查询):

https://jira.mongodb.org/browse/SERVER-828

有关位置操作的更多信息,请参见:

http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

+0

是的谢谢你的答案。我想我现在必须在应用程序方面做到这一点!这很奇怪,因为如果他们实施更新,它不应该是非常不同的发现...不管怎样,希望功能即将推出! – Johanisma 2011-06-09 13:17:09

+1

同意......请在Jira投票支持问题以帮助将其投入产品。 – Ryan 2011-06-10 13:40:32

+0

显然没有实现:(他们建议使用'$ elemMatch'。 – MaicolBen 2014-03-27 13:36:39

0

这可能是一个矫枉过正,但我​​想你可以使用map-reduce。

首先,使用查询进行预过滤,发射映射中的所有数组元素,过滤那些在发射或减少中不匹配的元素。如果你没有列出在RAM中会发生的一切。

如果您必须经常运行这些查询,那么复制数据可能是值得的。

尽管如此,我希望SERVER-828能很快实现!

7

你在找什么是$elemMatch运营商。

+1

这实际上是正确答案 – MaseBase 2012-10-17 00:52:52

+0

您可以详细说明$ elemMatch如何在这种情况下用于返回匹配对象的一部分数组? – gaurav5430 2017-08-29 19:27:11

0

中,而不是创建$查询和你相等值添加到阵列,这能够解决您的问题

$users_array = array(xxxxxxxx,yyyyyy);  
$user = Db::find('fb_users', array(
          'facebook_id' => array(
           '$in' => array($users_array) 
          ) 
         ));