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

时间:2014-05-28 16:48:15

标签: mongodb

我正在寻找的东西在某种程度上相当于在SQL中做的事情:

WHERE 1 = 0

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

例如,在我的用例中:

StampleFilters().underCategoryIds(sharedCategoryIds.toList)

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

有没有简单的方法来做这样的事情,而不会对表演产生任何影响?

我可能会添加一些像{ somefield: unexistingvalue }这样的查询,但我想知道是否还有更好的。

修改

我希望表达式是可组合的。我的意思是它应该适用于像$or(exp1,exp2,exp3)这样的查询,其中exp1例如是永远不匹配的表达式。

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

2 个答案:

答案 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)

我想出了几种方法来实现这个目标:

  1. " P&!P":{ $and: [ {X:0}, {X:{$ne:0}} ] }
  2. " $ in"一个空列表:{ X: {$in: []} }
  3. 没有什么可以是这个{ X: {$size: 9999999999999999} }
  4. " noScan":db.coll.find({})._addSpecial("$maxScan", 0)
  5. 编辑:

    • 使用$where{ $where: function() {return 0} }
    • 再做一次