MONGO 查找数组中至少有一个项目不在另一个项目中的文档

mongo find documents where at least one item from an array is not in the other

本文关键字:项目 另一个 文档 有一个 查找 数组 MONGO      更新时间:2023-09-26

我在 mongo 中遇到了这个问题,我想进行查询(常规 mongo 查询,使用终端)以查找字段为空或至少有一个值与正则表达式数组不匹配的所有文档。

我的文档具有以下模式:

{
  "id": "20",
  "array": ["abc123", "abc456", "def123", "ghi123"]
}

{
  "id": "21",
  "array": ["abc123", "abc456", "def123"]
}

我与之匹配的数组如下所示:

[new RegExp(abc), new RegExp(def)]

查询的结果应该只是第一个文档,因为这个文档包含"ghi123",它与数组中的任何正则表达式都不匹配。

我知道有像$all、$elementMatch、$in等运算符来构建这个查询,但到目前为止,我还没有找到正确的解决方案,而且我已经卡了很长时间......我发现其他 StackOverflow 页面我发现它们很有用,可能会得到正确的答案,但我还没有能够将其应用于我的问题。这个似乎是最有用的:

检查数组中的每个元素是否都符合条件

有人知道如何解决这个问题吗?

这实际上只是一个正则表达式问题,因为所有逻辑都可以在那里处理:

db.collection.find({ "array": /^(?!abc|def)/ })

这基本上只是一个否定的断言,即被测试的元素匹配由 | 分隔的任一条件,这意味着 or

由于第一个文档是唯一具有不满足条件的数组元素的文档,因此它是唯一在此处评估 true 的情况。

正则表达式通常由基本"字符串"构造而成,因此考虑到"列表"的以下表示形式,这应该不难理解:

var args = ["abc","def"];
var exp = "^(?!" + args.join("|") + ")";
db.collection.find({ "array": new Regexp(exp) });

甚至:

var args = ["abc","def"];
var inclause = { "$in": [ ] };
inclause["$in"] = args.map(function(arg) {
    return new Regexp( "^(?" + arg + ")" );
});
db.collection.find({ "array": inclause });

但第一种形式通常应该更有效率。