删除同一字段上匹配的两个正则表达式

时间:2018-05-31 11:57:48

标签: mongodb mongodb-query

我需要删除同一变量但具有多个条件的文档。

db.getCollection('system_parameter').remove(
{
    "variable":/^pickup_kota/,
    "variable":
    {
        $nin:
        [
            /^pickup_kota_jakarta/
        ]
    }
}

我想要做的是,我想删除所有具有相同前缀('pickup_kota')的数据,但不包括('pickup_kota_jakarta')文档。

如果我执行上面的查询,则删除所有数据,包括让我们说前缀'some_doc'但不包括'pickup_kota_jakarta'

2 个答案:

答案 0 :(得分:1)

所有MongoDB查询参数都已经是AND条件,因此只需将它们包含在同一个键上:

db.getCollection('system_parameter').remove({
  "variable": { 
    "$regex": /^pickup_kota/,
    "$nin": [
      /^pickup_kota_jakarta/
    ]
  }
})

或者你总是可以写出#34; long form" $and

db.getCollection('system_parameter').remove({
  "$and": [
    { "variable": /^pickup_kota/ },
    { "variable": "$nin": [/^pickup_kota_jakarta/] }
  ]
})

所以有两个这样的文件:

{ "variable" : "pickup_kota_somewhere" }
{ "variable" : "pickup_kota_jakarta" }

只有第一个被删除

但只要您可以在此处使用其他操作符(如$regex)将条件分隔到键上,那么您就不需要完整的表单。

此外,由于这些都锚定在字符串的开头,因此MongoDB进行两次比较比尝试使用正则表达式来满足两种可能的条件更有效。唯一可以破坏该边界规则的正则表达式,并且通过搜索锚定到可以使用索引的字符串的开头来获得效率。

答案 1 :(得分:0)

您可以尝试$ all运算符。

db.getCollection('system_parameter').remove({
  "variable": {$all: [
               {$regex: /^pickup_kota/},
               {$nin:[/^pickup_kota_jakarta/]} 
              ]}
})