Javascript mongo查找数组中至少一项不在另一项中的文档

Javascript mongo查找数组中至少一项不在另一项中的文档,javascript,regex,mongodb,mongodb-query,Javascript,Regex,Mongodb,Mongodb Query,我在mongo中遇到了这个问题,我想进行一次查询(使用终端的常规mongo查询)来查找所有字段为空或至少有一个值与正则表达式数组不匹配的文档 我的文档具有以下模式: { "id": "20", "array": ["abc123", "abc456", "def123", "ghi123"] } 及 我要与之匹配的数组如下所示: [new RegExp(abc), new RegExp(def)] 查询的结果应该只是第一个文档,因为这个文档包含“ghi123”,它与数组中的任何正则表

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

我的文档具有以下模式:

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

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

[new RegExp(abc), new RegExp(def)]
查询的结果应该只是第一个文档,因为这个文档包含“ghi123”,它与数组中的任何正则表达式都不匹配

我知道有$all、$elementMatch、$in等操作符来构建这个查询,但到目前为止,我还没有找到正确的解决方案,而且我已经被困了很长一段时间了。。。我发现其他StackOverflow页面很有用,可能会找到正确的答案,但我还没有将其应用到我的问题中。这一条似乎是最有用的:


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

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

db.collection.find({“array”:/^(?abc | def)/)
这基本上是一个否定的断言,即被测试的元素匹配由
分隔的条件,这意味着

因为第一个文档是唯一一个数组元素不满足条件的文档,所以它是唯一一个在这里计算为true的情况

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

var args=[“abc”,“def”];
var exp=“^(?!+args.join(|)”+”;
find({“array”:newregexp(exp)});
甚至:

var args=[“abc”,“def”];
var incluse={“$in”:[]};
incluse[“$in”]=args.map(函数(arg){
返回新的Regexp(“^(?“+arg+”);
});
find({“array”:incluse});

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

那么,如何对RegExp()数组求反呢?因为我的代码将动态生成这个正则表达式列表,所以我有一个类似于上面所示的列表。@pidgey您可以交替地在
$in
操作符中重复每个单独的术语,甚至在
$或
操作符中重复每个单独的术语,这对于m as
$in
来说更为明确。但正如我所说的,正则表达式基本上是由一个“字符串”构造而成的,作为一个馈送构造(特别是当使用
RegExp
作为构造函数时),因此用一个“|”管道连接元素并不是一项困难的任务。使用原始正则表达式的效率更高。特别是当您在字符串的开头锚定“^”时,这允许非常有效地使用索引。我不确定是否遵循。。。你的建议是这样的:db.collection.find({'array':{'in':[{'not':new RegExp(“abc”)},{'not':new RegExp(“def”)}}})@pidgey No。不要太在意其他响应,因为它们是错误的。添加了更多信息以显示这两种情况的基本结构。我的实际数据包含/、:和~,这是一个问题吗?因为我得到一个空集合作为返回,但是应该有匹配项。我以前也有过类似的问题
[new RegExp(abc), new RegExp(def)]