MongoDB本机节点驱动程序:解释是否破碎?

时间:2015-01-08 15:51:31

标签: javascript node.js mongodb

我无法使用Node.js的本机mongodb驱动程序获得正确的解释。 当我使用mongo shell时,一切都很好。我的语法错了吗?还有什么我可能做错了吗?

db.user.find({},{explain:true}).toArray

db.user.find({}).explain

我已尝试过这两种方法,用户表中有两个文档,它给了我这个输出:

{ cursor: 'BasicCursor',
  isMultiKey: false,
  n: 1,
  nscannedObjects: 1,
  nscanned: 1,
  nscannedObjectsAllPlans: 1,
  nscannedAllPlans: 1,
  scanAndOrder: false,
  indexOnly: false,
  nYields: 0,
  nChunkSkips: 0,
  millis: 0,
  allPlans: 
   [ { cursor: 'BasicCursor',
       isMultiKey: false,
       n: 1,
       nscannedObjects: 1,
       nscanned: 1,
       scanAndOrder: false,
       indexOnly: false,
       nChunkSkips: 0 } ],
  server: 'Rocket.local:27017',
  filterSet: false,
  stats: 
   { type: 'LIMIT',
     works: 2,
     yields: 0,
     unyields: 0,
     invalidates: 0,
     advanced: 1,
     needTime: 1,
     needFetch: 0,
     isEOF: 1,
     children: [ [Object] ] } }

这是错误的。当我在mongo shell中运行相同的查询时,它会给出正确的输出:

"cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 2,
    "nscannedObjects" : 2,
    "nscanned" : 2,
    "nscannedObjectsAllPlans" : 2,
    "nscannedAllPlans" : 2,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "Rocket.local:27017",
    "filterSet" : false,
    "stats" : {
        "type" : "COLLSCAN",
        "works" : 4,
        "yields" : 0,
        "unyields" : 0,
        "invalidates" : 0,
        "advanced" : 2,
        "needTime" : 1,
        "needFetch" : 0,
        "isEOF" : 1,
        "docsTested" : 2,
        "children" : []
    }

我还有一些其他(相关问题)......

Limit = 1 = 1ms, Limit > 1 = 150ms (mongo-melt-down)

Odd MongoDB/Node Explain Results

2 个答案:

答案 0 :(得分:1)

在我进行了一系列低级分析和优化之后,应该在驱动程序的2.0.13中修复。

答案 1 :(得分:0)

看起来像是2.0.x问题。已经提交了门票。

似乎是2.0.x驱动程序的问题:这是一个线程...

我刚用2.0.x和1.4.x运行完全相同的查询。当Limit = 1时,两者都执行快〜1ms。当Limit = 2时,1.4.x版本保持在1ms左右,但2.0.x版本会跳到25ms。因此,这不仅仅是解释输出的问题 - 这只是问题的症状。

2015年1月8日星期四UTC-8上午9:04:05,Joshua Abrams写道:有趣......完全相同的查询使用1.4.x产生正确的解释,其中n = 2(依此类推)。这会影响性能吗?当我运行一个Limit = 1的查询时,它的速度很快(正如预期的那样),但是当Limit = 2时,速度会慢100倍......

2015年1月8日星期四UTC-8上午8:52:28,christkv写道:不是真的。我的建议是制作一个可重复性最小的测试用例(代码和数据)并在jira.mongodb.com上打开一张票。有点难以知道会发生什么。它不太可能是驱动程序,但人们永远不会知道。尝试1.4.x分支以及至少排除它是2.0.x分支问题。

2015年1月8日星期四下午5:47:45 UTC + 1,Joshua Abrams写道:刚检查过,我正在使用2.0.12的驱动程序。还有其他想法吗?

在2015年1月8日星期四UTC-8上午8:23:16,christkv写道:解释只是重新调整驱动程序中的所有结果而不是部分结果。因此你得到了计划。我想到的一件事可能是你在1.4.19之前的驱动程序上遇到错误,其中batchSize设置为1。

2015年1月8日星期四下午5:01:42 UTC + 1,Joshua Abrams写道:我最近遇到了一系列与驱动程序有关的性能问题。限制= 1 = 1毫秒,限制> 1 = 150ms(mongo-melt-down)

不确定它的根本原因 - 当我无法得到正确的解释时,无法进行调试:MongoDB本机节点驱动程序:解释是否已损坏?