【问题标题】:MongoDB : use $ positional operator for queryingMongoDB:使用 $ 位置运算符进行查询
【发布时间】: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 个结果,这不会是一个问题。

标签: mongodb querying


【解决方案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)
                                )
                            ));
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多