1

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

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

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

我知道我可以像这样轻松地连接两个字段:

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

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

这个答案非常接近,但不幸的是,它缺少关于在$in上下文中究竟如何使用该解决方案的最后一条信息。而且由于我认为这是一个一般用法问题,但找不到任何关于它的信息(至少使用我使用的搜索词),我正在打开这个单独的问题。

编辑:如果可能的话,我想避免使用聚合。我要查找的查询应该用作节点驱动程序方法filter的参数。deleteMany

4

2 回答 2

1

确实,你们真的很亲近。

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


这是一个解决方案;在这里试试

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

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

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

PS:有一个 mongo 运算符$nin可以组合$not$in

db.collection.aggregate([
  {
    "$project": {
      "full_name": {
        $concat: [
          "$firstname",
          " ",
          "$lastname"
        ]
      }
    }
  },
  {
    $match: {
      full_name: {
        $nin: [
          "Alice In wonderland",
          "Bob Marley"
        ]
      }
    }
  }
])
于 2020-09-17T12:34:06.393 回答
1

您可以使用$expr, 和 for 不等于$not使用$in,

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

操场

于 2020-09-17T12:42:51.260 回答