【发布时间】: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 就否定它。
编辑:扩展数据集,扩展并阐明我对答案的实际要求。
【问题讨论】:
标签: javascript mongodb logic