【问题标题】:How to query: Array does not contain (case insensitive) element如何查询:数组不包含(不区分大小写)元素
【发布时间】:2020-08-20 10:15:33
【问题描述】:

我正在尝试检索标签 array 不包含忽略大小写的元素的文档。

我正在使用我的数组的逆包含查询:

.find({"tags":{"$regex": "^(?!someTag$)", "$options": "i"}})

然而,这个返回也返回有一个标签不是“someTag”的文档。

【问题讨论】:

  • 有一个叫$nin的运营商可以帮助你。 docs.mongodb.com/manual/reference/operator/query/nin
  • @igorkf 如果不是不区分大小写,那将是解决方案
  • 也许这有帮助:db.collection.find( { $text: { $search: "-someTag", $caseSensitive: false } } )
  • 请提供示例文档和所需的o/p..

标签: mongodb mongodb-query


【解决方案1】:

您可以使用不等于 $ne 运算符获得 array does not include 行为,并使用 collation 获得不区分大小写的行为。

考虑一个包含多个标签的集合:

> db.coll.find({},{_id:0})
{ "tags" : [ "Tag1", "Tag2", "Tag3" ] }
{ "tags" : [ "tag1", "tag2", "tag3" ] }
{ "tags" : [ "TAG4", "TAG3", "TAG5" ] }
{ "tags" : [ "tag4", "tag6", "tag7" ] }

$ne 可用于排除完全匹配:

> db.coll.find({tags:{$ne:"tag3"}},{_id:0})
{ "tags" : [ "Tag1", "Tag2", "Tag3" ] }
{ "tags" : [ "TAG4", "TAG3", "TAG5" ] }
{ "tags" : [ "tag4", "tag6", "tag7" ] }

添加排序规则后,$ne 匹配可以不区分大小写:

> db.coll.find({tags:{$ne:"tag3"}},{_id:0}).collation({locale:"en",strength:1})
{ "tags" : [ "tag4", "tag6", "tag7" ] }

请注意,为了在此查询中使用索引,您需要使用相同的排序规则创建适当的索引。

【讨论】:

    【解决方案2】:

    同事提供的答案:

    添加一个简单的 $not 就可以了。

    .find({"tags": {"$not": {"$regex": "^(?!someTag$)", "$options": "i"}}},{"tags":1})
    

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 2017-04-16
      • 2023-03-07
      • 2012-02-18
      • 2020-10-14
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多