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

Posted

技术标签:

【中文标题】如何将 NOT (A AND B) 转换为 mongodb 查询【英文标题】:How to translate NOT (A AND B) into a mongodb query 【发布时间】:2019-10-25 07:52:20 【问题描述】:

我已经构建了一个语法(使用 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 就否定它。

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

【问题讨论】:

【参考方案1】:

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


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

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


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

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

【讨论】:

谢谢!这似乎非常适合我最初的问题,让我更多地思考我需要什么。在我最初的帖子中,我将问题简化为最简单的形式,这是一个很好的解决方案,但我已经编辑了我的帖子以提供更多细节 - 不幸的是,我不相信这是解决扩展问题的方法。 这只是对上述内容的扩展,我将添加到我的答案中

以上是关于如何将 NOT (A AND B) 转换为 mongodb 查询的主要内容,如果未能解决你的问题,请参考以下文章

ASP如何将SQLSERVER数据导出到DBF(VF)

Myeclipse如何将文件放入Tomcat的ROOT下?

如何将CMD窗口背景改成透明?

如何将datagridview中数据导出

C语言如何将外部数据导入?

如何将excel导入到数据窗口中