如何使用串联作为MongoDB $ in运算符的字段名称?

问题描述

假设我有一个名称列表,并且想匹配不属于该名称的文档:

{ firstname: { $not: { $in: ["Alice","Bob"] } } }

但是现在我必须匹配名字+姓氏(即给定的列表为["Alice Smith","Bob Jones"])。

我知道我可以很容易地将两个字段连接起来,像这样:

{ $concat: ["$firstname"," ","$lastname"] }

但是如何像在这里使用firstname一样在初始查询中使用这个新的“字段”?显然,我不能只用此表达式替换对象键。

This answer非常接近,但是不幸的是,它缺少最后一条信息,该信息关于一个人如何在$in上下文中使用该解决方案。而且,由于我认为这是一个普遍使用的问题,但无法找到任何相关信息(至少使用我使用的搜索字词),因此我打开了这个单独的问题。

编辑:如果可能,我想避免使用聚合。我要查找的查询应该用作the Node driver's deleteMany methodfilter参数。

解决方法

确实,你真的很亲近。

您必须使用汇总。这是一个“阶段”序列,在每个阶段中,您可以转换数据并将结果传递到下一个阶段。


这是一个解决方案;试试Here

使用$project,我用您的full_name创建一个新字段$concat

然后使用$match,我使用您的条件{ firstname: { $not: { $in: ["Alice","Bob"] } } },但我将其应用于新创建的full_name

您可以在mongoplayground中删除$match并查看其作用。

PS:有一个mongo运算符$nin执行$not$in

的组合
db.collection.aggregate([
  {
    "$project": {
      "full_name": {
        $concat: [
          "$firstname"," ","$lastname"
        ]
      }
    }
  },{
    $match: {
      full_name: {
        $nin: [
          "Alice In wonderland","Bob Marley"
        ]
      }
    }
  }
])
,

您可以使用$expr,但不等于使用$not外侧的$in

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $not: {
          $in: [
            { $concat: ["$firstname","$lastname"] },["Alice In wonderland","Bob Marley"]
          ]
        }
      }
    }
  }
])

Playground