7

我有一个条目的集合,如下所示:

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

我希望能够查询该集合并仅返回数组的一部分:与查询匹配的部分。我正在尝试使用 $ 位置运算符来执行此操作,但到目前为止还没有奏效。

更确切地说,这是我想做的事情:

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

结果,我希望某事仅具有与匹配查询的数组中的条目相对应的值,在这种情况下为 100。

你知道出了什么问题吗?我在想也许 $ 运算符只能用于更新而不用于查询。有知情人士吗?

谢谢 !

4

4 回答 4

8

是的,您是正确的 - 位置运算符用于更新对象。

现在的解决方案是返回数组并在您的应用程序中拉出字段。

此功能有一个开放的增强请求(在查询中):

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

有关位置运算符的更多信息,请参见:

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

于 2011-06-08T15:16:33.360 回答
8

您正在寻找的是$elemMatch运算符。

于 2012-06-24T13:14:01.563 回答
0

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

首先,使用查询进行预过滤,发出 map 中的所有数组元素,过滤在 emit 或 reduce 中不匹配的元素。如果您不设置,一切都会在 RAM 中发生。

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

不过,我希望 SERVER-828 能尽快实施!

于 2011-08-23T15:59:33.520 回答
0

改为使用 $in 创建查询并将相等的值添加到数组中,这可以解决您的问题

$users_array = array(xxxxxxxx,yyyyyy);     
$user = Db::find('fb_users', array(
                            'facebook_id' => array(
                                '$in' => array($users_array)
                            )
                        ));
于 2013-07-24T16:19:07.237 回答