javascript - 如何将 NOT (A AND B) 转换为 mongodb 查询

标签 javascript mongodb logic

我已经构建了一个语法(使用 peg.js)来支持 Node.js 网络应用程序中的简单搜索查询;我需要将它生成的 AST 转换为 MongoDB 聚合函数的 $match 参数。大多数情况下都很好,但我无法弄清楚 NOT (A AND B) 在 MongoDB 中应该是什么样子。

一些示例数据:

{ _id:123, labels:['a', 'b', 'c'], tags:['g', 'h', 'i']},
{ _id:456, labels:['a', 'e', 'f'], tags:['i', 'j', 'k']},
{ _id:789, labels:['c', 'd', 'b'], tags:['h', 'l', 'm']}

用户可能会输入查询 NOT (labels:a AND labels:b)NOT (labels:b AND tags:h) 这两个都是有效的查询,基于我的语法。

第一个查询的目的是返回所有在其 labels 字段中不包含 'a' 和 'b' 的文档(因此将返回第二个和第三个文档) ;对于第二个查询,它应该匹配所有不包含 labels 字段中的 'b' 和 tags 字段中的 'h' 的文档。

MongoDB 的 $not 运算符似乎不允许您以我正在寻找的方式巧妙地否定逻辑操作;理想情况下,我想做类似的事情:

{
    $not: {
        $and: [
            { labels: a},
            { labels: b},
        ]
    }
}

{
    $not: {
        $and: [
            { labels: b},
            { tags: h},
        ]
    }
}

我可以使用其他运算符来执行此操作吗?此外,理想情况下,这将很容易以编程方式构建 - 这样我就可以在括号内构建一个可能很复杂的复合查询,然后如果有 NOT 就否定它。

编辑:扩展了数据集,扩展并阐明了我对答案的实际要求。

最佳答案

对于一个字段(根据原始问题)应该这样做:

{
    'labels': {
        '$not': {
            '$all': [
                'a',
                'b',
            ]
        }
    }
}

对于多个字段,您需要将它们分开,但此查询可行:

{
    '$and': [
        {
            'labels': {
                '$not': {
                    '$all': ['b'],
                },
            },
        },
        {
            'tags': {
                '$not': {
                    '$all': ['h'],
                }
            }
        }
    ]
}

我认为不可能将 not 作为主要的根元素

关于javascript - 如何将 NOT (A AND B) 转换为 mongodb 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534418/

相关文章:

javascript - Js标准对象(以字符串为键的数组)作为ajax发布数据不起作用

javascript - 将数组组合成一个对象?

javascript - Javascript 中字符串的 Switch-Case 未按预期工作

mongodb - 如何将查询输出存储在tempdb中?

javascript - 尝试了解如何在js中使用Promise

mongodb - 使用 Helm 在 Kubernetes 中安装 Mongodb

javascript - 从 jquery 中的文本区域逐行解析,然后逐字解析

javascript - 数组 数学逻辑 JavaScript

c - 递归函数怎么会返回一些东西?

Python:pyswip 输出返回 Atom 和 Functor