如何指定没有结果的MongoDB查询(“其中0=1”)
我正在开发一个软件,将业务领域中的查询转换为MongoDB查询文档 为此,我需要一些类似MongoDB的“WHERE 0==1”子句的东西,即可以与如何指定没有结果的MongoDB查询(“其中0=1”),mongodb,mongodb-query,Mongodb,Mongodb Query,我正在开发一个软件,将业务领域中的查询转换为MongoDB查询文档 为此,我需要一些类似MongoDB的“WHERE 0==1”子句的东西,即可以与$和和$或运算符组合的查询文档,其行为类似于逻辑false,可以通过mongo查询引擎进行优化 这样,如果查询生成器的某个子部分检测到“不可能”的情况,它可能只返回这个“false”查询文档,并让mongodb引擎忽略查询语法树的相应分支 {$where:“false”}可以做到这一点,但在本例中,mongoDB引擎对结果的每一行计算“false”(
$和
和$或
运算符组合的查询文档,其行为类似于逻辑false
,可以通过mongo查询引擎进行优化
这样,如果查询生成器的某个子部分检测到“不可能”的情况,它可能只返回这个“false”查询文档,并让mongodb引擎忽略查询语法树的相应分支
{$where:“false”}
可以做到这一点,但在本例中,mongoDB引擎对结果的每一行计算“false”(而不是简单地返回一个空结果集)
我还提出了{u id:{$exists:false}}
,但是explain()
显示查询仍然使用索引扫描
所以我很好奇是否还有其他方法可以获得一个空的结果集
更深入的解释
我的软件的用户将能够用特定于领域的查询语言定义查询,该语言将被翻译成一个相当复杂的mongodb查询文档。这个查询的形式基本上是{$和:[{$或:[{},{$和:…},…}]}
,因此这是一个嵌套很深、相当复杂的条件树
树的构造目前很简单,因为域查询的每个元素都或多或少地很好地转换为相应的Mongo查询
如果在树的深处有一个条件,“我的软件”可以自行决定它总是错误的,我想让Mongo查询引擎尽可能清楚地知道这一点。例如,如果所有“中间”文档都由$和运算符组成(因此查询的总体结果总是“false”),我希望mongo引擎尽快检测到这一点
如果我在SQL中这样做,等价物将是
SELECT * FROM TABLE WHERE C1 AND C2 AND (C3 OR C4) AND ... AND (1=0)
当SQL引擎获得此查询时,它根本不需要查询任何索引或表,因为可以“证明”条件始终为false。索引扫描将是您在解释查询中可以看到的最快的操作之一。一种更快的方法是创建一个稀疏索引,然后使用提示强制查询使用该索引
因此,索引创建:
db.myCollection.createIndex( { "does_not_exist": 1 }, { sparse: true })
查询:
db.myCollection.find(
{ "does_not_exist":
{ $exists: true },
$hint:
{does_not_exist : 1}
})
我自己还没有测试过,所以您可能需要自己测试一下,看看这是否能满足您的需要,但我怀疑这是一条值得探索的道路。首先,您应该只使用该操作符,并且只有在使用任何其他查询操作符都无法解决问题时才使用该操作符。但以我的一点经验,如果$where
能够做到这一点,那么它就会做得更好,除非您的模式设计非常糟糕,或者正在查询表达式中做一些不应该做的事情
在这篇文章中,我解释了为什么应该使用$redact
而不是$where
根据我的理解,您可以使用$redact
操作符这样做:
db.collection.aggregate([
{ "$redact": {
"$cond": [
{ "$eq": [true, false]},
"$$KEEP",
"$$PRUNE"
]
}}
])
和变量是一个系统变量,允许您根据传统表达式的返回值“保留”或排除所有文档。对于3.6版,您可以直接表示:
{ $expr: { $eq: [0, 1] } }
排除所有字段的投影?你的问题很难理解。请出示预期结果的样本文档好吗?@Styvane对不起,我的英语;)我试图补充一些额外的解释。基本上,我的查询是自动构建的,我正在寻找一些方法,让Mongo优化掉“不可能”的条件。。。