【问题标题】:Mongo Query that always returns zero documents始终返回零文档的 Mongo 查询
【发布时间】:2018-05-16 21:54:38
【问题描述】:

可以编写一个始终返回集合中所有元素的查询,以 pymongo 为例:

MongoClient()["database"]["collection"].find({})

但是,由于我的代码结构,我非常希望能够构建一个相反的查询,一个在所有情况下都必然返回零元素的查询:

MongoClient()["database"]["collection"].find(null_query)

如何定义null_query,这样才正确?

【问题讨论】:

  • 我对 mongo 不是很熟悉,但会尝试一些类似查询无效_id 的方法,甚至只是尝试{ _id: { $exists: false } } ...(但它很可能是在内部以某种方式检测到这是荒谬的,并导致某种错误...)
  • 你能解释一下想要这个的理由吗?乍一看,这似乎是寻找问题的解决方案,尽管我可能错了。
  • @yivi 聊天中讨论了基本原理,大致:查询应该是由抽象类“自动生成”的。所以必须有一个实际的 query 来实现始终返回空结果的目标。 (至少我是这么理解的——也许可以把它编辑成问题,让它更清楚......)
  • 但是为空集合返回游标似乎并不完全有用,是吗?您可以手动创建空的 Collection 和 Cursor 并将其返回(尽管文档不鼓励)......但我看不到重点。 “强制” MongoClient 返回那将是无用的(因此它不存在)。查询一个已知的空集似乎是浪费,充其量。
  • 然而,查询一个已知的空集,正如您迄今为止唯一的答案所暗示的那样,似乎都非常明显(q:如何获得一个空的结果?a:查询不存在的文档!)而且有点浪费。但是,如果它对您有所帮助,那么您将获得更多力量。我不知道,也许 MongoClient 确实针对这种情况进行了优化。

标签: python mongodb pymongo


【解决方案1】:

您可以要求将任何字段放在一个空列表中。为此使用_id 字段似乎是合理的:

db.collection.find({_id: {$in: []}})

如果您想要更短的查询,则不需要使用 _id 字段 完全没有:

db.collection.find({_:{$in:[]}})

如果 MongoDB 版本 >= 3.4 的替代方案:

也可以问_id 字段是否不存在,@Marco13 已建议:

db.collection.find({_id: {$exists: false}})

但是,这假定所有文档都具有 _id 字段,这对于 3.4 之前的 MongoDB 版本不一定正确,可以使用 db.createCollection("mycol", {autoIndexID : false}) 创建集合,因此不会自动为所有文档提供 _id 字段。

【讨论】:

  • 这看起来很棒!有点不整洁,但我怀疑这是最简洁的表示。我明天会去告诉你!
  • 这里$exists: false不应该和$in: []有同样的效果吗? (这可能有点更清晰,但这可能是一个主观的细节)
  • @Imran @Marco13 ,$exists: false 解决方案不适用于没有_id 的文档,可以使用db.createCollection("noautoid", { autoIndexId: false }) 创建。
  • @HaskellElephant 是的,但似乎 autoIndexId 在 3.4 中已被删除(请参阅 jira.mongodb.org/browse/SERVER-19067 )。如果您没有看到任何其他不使用它的理由,您可以将其作为另一个选项编辑到您的答案中(提到 autoIndexId 的警告和 mongo 版本),或者我会将其添加为相应的另一个答案。
  • @marco13 我已按照您的建议将其编辑到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多