我需要删除同一变量但具有多个条件的文档。
db.getCollection('system_parameter').remove(
{
"variable":/^pickup_kota/,
"variable":
{
$nin:
[
/^pickup_kota_jakarta/
]
}
}
)
我想要做的是,我想删除所有具有相同前缀('pickup_kota')的数据,但不包括('pickup_kota_jakarta')文档。
如果我执行上面的查询,则删除所有数据,包括让我们说前缀'some_doc'但不包括'pickup_kota_jakarta'
答案 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/]}
]}
})