MongoDB Native Node Driver: Explain is Broken?

MongoDB Native Node Driver: Explain is Broken?

我无法使用 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.x 的问题。已经提交工单。

似乎是 2 的问题。0.x driver:这是一个线程...

我只是 运行 与 2.0.x 和 1.4.x 完全相同的查询。当 Limit = 1 时,两者都执行得很快 ~1ms。当 Limit = 2 时,1.4.x 版本保持在 1ms 左右,但 2.0.x 版本跳到 25ms。所以,这不仅仅是解释输出的问题 - 这只是问题的一个症状。

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

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

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

2015 年 1 月 8 日星期四 8:23:16 上午 UTC-8,christkv 写道:解释只是重新调整 driver 中的所有结果而不是部分结果。这样你就得到了计划。想到的一件事可能是您使用的 driver 早于 1.4.19,在 batchSize 设置为 1 时出现错误。

2015 年 1 月 8 日星期四 5:01:42 UTC+1 下午,Joshua Abrams 写道:我最近在使用 driver 时遇到了一系列性能问题。限制 = 1 = 1 毫秒,限制 > 1 = 150 毫秒 (mongo-melt-down)

不确定根本原因是什么 - 当我无法得到正确的解释时无法调试:MongoDB 本机节点 Driver:解释已损坏?

在我做了一堆低级分析和优化后,应该在驱动程序的 2.0.13 中得到修复。