MongoDB:使用$ position运算符进行查询

时间:2011-06-08 14:21:10

标签: mongodb querying

我有一个包含以下条目的集合:

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

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

更准确地说,我想做的是:

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

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

你知道什么是错的吗?我在想,也许$运算符只能用于更新而不能用于查询。有人知道吗?

谢谢!

4 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

答案 1 :(得分:8)

您正在寻找的是$elemMatch运营商。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

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