MONGO 查找数组中至少有一个项目不在另一个项目中的文档
mongo find documents where at least one item from an array is not in the other
我在 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 });
但第一种形式通常应该更有效率。
相关文章:
- 通过另一个php应用程序将我的项目推送到Github存储库中
- 相对于角度控制器中的另一个阵列过滤阵列项目
- 如何使用jquery将所选项目从一个下拉组列表(optgroup)移动到另一个下拉列表(optgroup)
- 在另一个项目中使用大理石测试rxjs5方法
- 如何将从GWT编译的JS添加/访问到另一个外部HTML / JS项目中
- 如何将一个表单中的项目添加到 Rails 中另一个表单的下拉选项
- 列表视图添加另一个不需要的页面项目
- 在AngularJS中切换编辑状态并更改项目'单击另一个函数
- 如何使项目在开始另一个过渡之前完成一个过渡
- 循环 HTML 表并将相同的项目及其计算的金额添加到另一个表中
- 单击项目以更改另一个项目的背景图像
- 在单击选项卡式项目时隐藏和创建另一个对象 - HTML CSS
- Jquery UI 可排序和可删除 - 无法将项目从一个列表克隆到另一个列表
- 如何在另一个项目中托管API 2.0
- MONGO 查找数组中至少有一个项目不在另一个项目中的文档
- 如何在Drupal 7中通过JS或Jquery模拟“添加另一个项目”
- 检查一个对象中的项目是否存在于另一个对象中(使用下划线)
- 我的启动项目中的JS文件的另一个“断点当前不会被命中”错误
- 如何根据另一个组合框的选定项目从数据库填充组合框中的项目
- 如何存储拖动&将项目放入cookie,然后在另一个页面中检索