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

Posted

技术标签:

【中文标题】MongoDB:使用 $ 位置运算符进行查询【英文标题】:MongoDB : use $ positional operator for querying 【发布时间】:2011-09-10 22:28:49 【问题描述】:

我有一个条目看起来像这样的集合:


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

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

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

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

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

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

谢谢!

【问题讨论】:

只是为了只返回您的值字段,collection.find('contents.tag':'whatever','contents.value':1) 就足够了,不需要位置运算符。尽管如此(正如瑞安在他的回答中已经提到的那样),有必要在应用程序端将字段从返回的数组(也包括文档的_id)中拉出来。缺点是与嵌套数组有关的 findOnelimit(1) 不起作用,如果您不期望超过 1 个结果,这不会是一个问题。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

是的,谢谢您的回答。我想我现在必须在应用程序方面这样做!这很奇怪,因为如果他们实现了更新,那么 find 应该不会有太大的不同......无论如何,希望这个功能很快就会出现! 同意...请为 Jira 中的问题投票,以帮助将其纳入产品。 显然没有实现:(,他们建议使用$elemMatch【参考方案2】:

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

【讨论】:

您能否详细说明在这种情况下如何使用 $elemMatch 来仅返回数组中匹配对象的一部分?【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于MongoDB:使用 $ 位置运算符进行查询的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/mongoose 查询和 $in 运算符

MongoDB in Go (golang) with mgo:如何使用逻辑运算符进行查询?

使用 python 和 pymongo 的 MongoDB 位置运算符索引问题

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

使用 While 循环和 Between 运算符进行查询?