我在 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 页面,并且可能会得出正确的答案,但我还无法将其应用于我的问题。这似乎是最有用的:
Check if every element in array matches condition
有人知道如何解决这个问题吗?
最佳答案
这实际上只是一个正则表达式问题,因为所有逻辑都可以在那里处理:
db.collection.find({ "array": /^(?!abc|def)/ })
这基本上只是一个否定断言,即被测试的元素匹配由 |
分隔的任一条件,这意味着或。
由于第一个文档是唯一一个具有不满足条件的数组元素的文档,因此它是此处唯一评估 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 });
但是第一种形式通常应该更有效。
关于javascript - mongo 查找数组中至少一项不存在于另一项中的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782142/