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

How to use a concatenation as the field name for the MongoDB $in operator?

假设我有一个姓名列表并且想要匹配不属于它的文档:

{ 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