创建永不匹配的mongo表达式的最佳方法

Seb*_*ber 6 mongodb

我正在寻找的是某种程度上相当于在SQL中做:

WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样的东西,因为我正在构建一个类型安全的DSL来对我的域执行查询,支持连接和析取.有时,添加一个永远不匹配任何内容的查询可能更容易,而不是在代码中处理它.

例如,在我的用例中:

StampleFilters().underCategoryIds(sharedCategoryIds.toList)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它不能按预期工作,因为它sharedCategoryIds是空的,因此它会导致查询$(),但不会过滤任何内容.对于一个空列表,我宁愿构建一个永远不会返回任何内容的查询.

有没有一种简单的方法来做这样的事情,对表演没有任何影响?

我可能会添加一些查询,{ somefield: unexistingvalue }但我想知道是否没有更好的.

编辑

我希望表达式是可组合的.我的意思是它应该在查询中工作,例如$or(exp1,exp2,exp3)在哪里例如exp1永远不匹配的表达式.

如果您有任何建议,那么解释为什么一个比其他人更好以及它如何影响查询引擎性能(或不是)会更好

Sal*_*ali 5

我认为实现你想要的最好的方法是添加 {_id : -1}

db.coll.find({a : 1})将被转化为db.coll.find({a : 1, _id : -1}).这比所有shx2解决方案都简单(除了最后一个带有noScan的解决方案).

此外,_id字段已经是主要索引,因此很快就会意识到_id集合中没有这样的字段.

PS如果有人会如此聪明地将他们的_id命名为-1,那么你就可以做到{_id : NaN}.如果有,_id = NaN那么你很可能需要重新开发你的应用程序.