【问题标题】:ODM Query Builder: Is there an "inverse in" operator, or equivalent operation?ODM 查询生成器:是否有“逆入”运算符或等效操作?
【发布时间】:2014-12-01 23:27:28
【问题描述】:

在我的 synfony 2 项目中,我使用查询生成器过滤搜索结果。在我的 MongoDB 中,我在数组中有一些值。

Query Bulider 具有“in”运算符,允许查询等于数组中多个值之一的值。我想执行相反的操作,即给定一个值,查询数据库中包含数组的条目,其中包含我的值。

例如,假设我的 MongoDB 中有这个条目:

{
  "_id": 123,
  "name": "John",
  "countries_visited":
  [
    "Australia"
    "Bulgaria",
    "Canada"
  ]
}

我想在我的数据库中查询访问过“加拿大”的人。现在,我正在使用where 属性,如下所示,但我正在寻找更好的方法来做到这一点。

        $qb->field('countries_visited')->where("function(){
            return this.indexOf(".$countryName.") > -1
        }");

编辑: innotIn 运算符接收一个数组作为参数,并将其与 MongoDB 中的单个值进行比较。我需要提供一个参数并将其应用于 MongoDB 中的数组字段,因此是“逆向”。如果有这样的事情,我想我需要一个contains 运算符。

【问题讨论】:

  • 我原以为 notIn() 会是你所追求的 :)
  • 不,请先阅读整个解释,而不仅仅是标题。
  • 我做过,但我不明白
  • Adam Elsodaney,我在问题的末尾添加了一个摘要,试图更好地解释它。您将如何查询所有访问过加拿大的人?
  • 谢谢,我明白了。

标签: mongodb symfony odm


【解决方案1】:

有趣的是,MongoDB 会自动处理这个问题。如果针对数组字段查询单个值,Mongo 将假定您想要检查数组是否包含该值。

取自docs

匹配一个数组元素

相等匹配可以指定要匹配的数组中的单个元素。如果数组包含至少一个具有指定值的元素,则这些规范匹配。

所以你应该可以做到

$users = $dm->getRepository('User')->findOneBy([
    'countries_visited' => 'Canada'
]);

$qb->field('countries_visited')->equals('Canada');

【讨论】:

  • 等号运算符可以在数组中工作吗?将尝试带回结果。谢谢。
  • 完全可以。附带说明一下,这只会将数组移动一级,并且不适用于数组内的数组。
猜你喜欢
  • 2012-02-08
  • 2011-05-04
  • 2018-12-29
  • 2014-12-04
  • 2016-04-23
  • 2017-08-21
  • 2019-05-19
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多