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

标签 mongodb

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

WHERE 1 = 0

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

例如,在我的用例中:

StampleFilters().underCategoryIds(sharedCategoryIds.toList)

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

有没有简单的方法来做这样的事情,而不影响性能?

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

编辑

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

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

最佳答案

我认为实现你想要的最好方法是添加 {_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 那么你很可能需要重新开发你的应用程序。

关于mongodb - 创建永远不匹配的 mongo 表达式的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917459/

相关文章:

node.js - Mongoose:如何将字段/值插入现有子文档中

node.js - 如何在嵌套文档中查找记录?

javascript - 编译后无法覆盖 `history` 模型

c# - 如何从子文档数组中只检索一个特定元素?

arrays - 如何使用 Node.js 驱动程序在 mongoDB 中多次插入数组?

javascript - 使用 Javascript 从 MongoDB 返回中提取值。

MongoDB 覆盖索引不起作用

node.js - 在 api 调用中更新 2 个 Mongoose 模式

node.js - 通过 _id 转换错误手动删除 connect-mongo session

node.js - 如何管理 Nodejitsu 创建的 MongoDB