【问题标题】:MongoDB : query result size greater than collection sizeMongoDB:查询结果大小大于集合大小
【发布时间】:2013-09-21 19:20:43
【问题描述】:

我正在分析 MongoDB 数据源以检查其质量。 我想知道是否每个文档都包含属性time:所以我使用了这两个命令

> db.droppay.find().count();  
291822   
> db.droppay.find({time: {$exists : true}}).count()   
293525

我怎样才能拥有比整个集合中包含的元素更多的给定字段的元素?怎么了?我找不到错误。 如果有必要,我可以向您发布文档的预期结构。

Mongo Shell 版本是 1.8.3。 Mongo Db 版本是 1.8.3。

提前致谢


这是文档条目的预期结构:

{
  "_id" : ObjectId("4e6729cc96babe974c710611"), 
  "action" : "send",
  "event" : "sent",
  "job_id" : "50a1b7ac-7482-4ad6-ba7d-853249d6a123",    
  "result_code" : "0",
  "sender" : "",
  "service" : "webcontents",
  "service_name" : "webcontents",
  "tariff" : "0",
  "time" : "2011-09-07 10:22:35",
  "timestamp" : "1315383755",
  "trace_id" : "372",
  "ts" : "2011-09-07 09:28:42"
}

【问题讨论】:

  • 这太奇怪了,你能更新一下文档结构吗....
  • 我可以插入、更新和读取集合。我用预期的文档结构更新了答案。
  • 难道它也算“时间戳”?您也可以尝试在“存在”查询中查找哪些对象被多次计算(根据stackoverflow.com/questions/4224773/…)。 “解释()”输出中有什么有趣的东西吗?您是否重命名了该字段?
  • explain() 显示的唯一有趣的事情是查询期间扫描的对象数量是相同的。两个查询都扫描了一个等于第二个结果大小的对象(293525):我认为该点在 find() 调用中。我尝试使用 find({}) 但结果(如预期)是相同的。我删除了所有带有时间戳字段的文档并重新运行查询,结果如下:db.droppay.find().count() = 101624; db.droppay.find({"ts": {$exists: true}}).count() = 102402; db.droppay.find({"time": {$exists: true}}).count() = 103327.

标签: mongodb


【解决方案1】:

我猜这是索引的问题。我敢打赌,droppay 在 :time 上有一个索引,并且一些不安全的操作更新了底层集合而没有更新索引。

你能试试repairing the db,看看会不会更好。

祝你好运。

【讨论】:

    【解决方案2】:

    可能有time 值是数组类型的。

    您可以通过db.droppay.find({time: {$type : 4}}) 查找此类文件。

    【讨论】:

    • 好建议!但不幸的是,这不是问题。我试过这个查询,它返回一个空结果...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2016-01-25
    • 2016-12-26
    相关资源
    最近更新 更多