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
)中拉出来。缺点是与嵌套数组有关的 findOne
或 limit(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 in Go (golang) with mgo:如何使用逻辑运算符进行查询?
使用 python 和 pymongo 的 MongoDB 位置运算符索引问题
如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符