我正在寻找的东西在某种程度上相当于在SQL中做的事情:
WHERE 1 = 0
我正在寻找这样的东西,因为我正在构建一个类型安全的DSL来对我的域执行查询,支持连接和析取。有时,添加一个永远不匹配任何内容的查询可能更容易,而不是在代码中处理它。
例如,在我的用例中:
StampleFilters().underCategoryIds(sharedCategoryIds.toList)
在这种情况下,它不能按预期工作,因为sharedCategoryIds
为空,因此会导致查询为$()
,但不会过滤任何内容。
对于一个空列表,我宁愿构建一个永远不会返回任何内容的查询。
有没有简单的方法来做这样的事情,而不会对表演产生任何影响?
我可能会添加一些像{ somefield: unexistingvalue }
这样的查询,但我想知道是否还有更好的。
修改
我希望表达式是可组合的。我的意思是它应该适用于像$or(exp1,exp2,exp3)
这样的查询,其中exp1
例如是永远不匹配的表达式。
如果您有任何建议,那么解释为什么一个比其他人好,以及它如何影响查询引擎的性能(或不是)
答案 0 :(得分:5)
我认为实现目标的最佳方法是添加{_id : -1}
db.coll.find({a : 1})
将转换为db.coll.find({a : 1, _id : -1})
。这比所有shx2解决方案都简单(除了最后一个带有noScan的解决方案)。
此外_id
字段已经是主要索引,因此很快就会意识到集合中没有这样的_id
字段。
P.S。如果某人如此聪明地将他们的_id命名为-1,那么你可以{_id : NaN}
。
如果有_id = NaN
,那么您很可能需要重新开发应用。
答案 1 :(得分:2)
我想出了几种方法来实现这个目标:
{ $and: [ {X:0}, {X:{$ne:0}} ] }
{ X: {$in: []} }
{ X: {$size: 9999999999999999} }
db.coll.find({})._addSpecial("$maxScan", 0)
编辑:
$where
:{ $where: function() {return 0} }