Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 监控MongoDB“;后台操作;?_Node.js_Mongodb_Mongodb Indexes - Fatal编程技术网

Node.js 监控MongoDB“;后台操作;?

Node.js 监控MongoDB“;后台操作;?,node.js,mongodb,mongodb-indexes,Node.js,Mongodb,Mongodb Indexes,编辑: 基本上,我在寻找一些关于如何理解在我的MongoDB实例上运行哪些后台操作的提示,并在必要时减少/禁用它们,以便它们不会干扰测试的运行。我尝试了mongostat和mongotop,但没有找到任何有助于我理解正在运行哪些后台操作以及启动这些操作的方法db.currentOp()在开始运行测试之前运行时,始终返回空数组 我在使用node(mocha、cucumber)开发时定期运行测试。从昨天开始,大约有25%的时间服务器初始化无法连接到mongodb,并出现以下错误: **Unhandl

编辑: 基本上,我在寻找一些关于如何理解在我的MongoDB实例上运行哪些后台操作的提示,并在必要时减少/禁用它们,以便它们不会干扰测试的运行。我尝试了
mongostat
mongotop
,但没有找到任何有助于我理解正在运行哪些后台操作以及启动这些操作的方法
db.currentOp()
在开始运行测试之前运行时,始终返回空数组

我在使用node(mocha、cucumber)开发时定期运行测试。从昨天开始,大约有25%的时间服务器初始化无法连接到mongodb,并出现以下错误:

**Unhandled rejection MongoError: exception: cannot perform operation: a background operation is currently running for collection** somecollection
    at Function.MongoError.create (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11)
    at /somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:793:66
    at bound (domain.js:254:14)
    at runBound (domain.js:267:12)
    at Callbacks.emit (.../node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:94:3)
    at null.messageHandler (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:235:23)
    at Socket.<anonymous> (/somepath/node_modules/pow-mongodb-fixtures/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:294:20)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)
**未处理的拒绝MongoError:异常:无法执行操作:当前正在为集合**somecollection运行后台操作
在Function.MongoError.create(/somepath/node_modules/pow mongodb fixtures/node_modules/mongodb/node_modules/mongodb core/lib/error.js:31:11)
at/somepath/node_modules/pow mongodb fixtures/node_modules/mongodb/node_modules/mongodb core/lib/topologies/server.js:793:66
绑定时(domain.js:254:14)
运行绑定时(domain.js:267:12)
在Callbacks.emit(…/node_modules/pow mongodb fixtures/node_modules/mongodb/node_modules/mongodb core/lib/topologies/server.js:94:3)
位于null.messageHandler(/somepath/node_modules/pow mongodb fixtures/node_modules/mongodb/node_modules/mongodb core/lib/topologies/server.js:235:23)
在插座上。(/somepath/node_modules/pow mongodb fixtures/node_modules/mongodb/node_modules/mongodb core/lib/connection/connection.js:294:20)
在Socket.emit(events.js:107:17)
在readableAddChunk(_stream_readable.js:163:16)
在Socket.Readable.push(_stream_Readable.js:126:10)
在TCP.onread(net.js:538:20)

我们使用pow mongodb fixture清除数据库,并在运行测试之前用一些基本数据填充它,这就是发生这种情况的地方。事情开始发生时,一切都没什么大的变化。我可以从哪里开始研究这个错误的来源呢?

在这种情况下,你的朋友会是:

db.currentOp(true)
指定true包括对空闲连接的操作和系统操作


请看这里:

我不打算将此标记为答案,因为我正在寻找一种方法来监控正在发生的事情,并通过mongo db解决问题。尽管如此,我还是解决了这个问题。这不是世界上最有用的解决方案,但事实证明,我们是在异步启动服务器,它将运行所有mongoose模式,从而检查/重新创建所有索引,同时或多或少地运行fixtures代码来清除我的集合


简而言之,在集合上创建索引时不要尝试删除它们:)

使用db.currentOp()检查正在运行的后台进程。在活动后台进程的情况下,客户端配置为抛出此错误。此命令始终返回空数组。可能在我运行它的时候,“后台操作”已经完成了。尽管如此,我有时需要运行3到4次才能克服此错误。使用
db.currentOp()
可能会正确,但可能只是没有正确使用它。本文更深入;在运行测试之前,我们需要1。清除整个数据库,然后清除2。插入一些基本文档。第2步是使用mongoose运行的,因此它也会添加索引,但这只有在完成清除之后才会发生。据我所知,是清理工作失败了。我可能是错的,错误可能来自确保索引的插入步骤(所有索引都应该已经存在)。@robocode,在我运行db.currentOp()时,它再次返回一个空数组。您链接的文章假设您有一个需要一分钟或更长时间才能完成的操作,并且您有足够的时间进行调查。在我的例子中,这些后台操作似乎运行了一两秒钟,然后停止,但经常会干扰清除数据库。当然,我这样做了,但您一直在指定运行db.currentOp(),而没有额外的参数,这可能对您的情况有所帮助。无论如何,很高兴听到您的问题得到了解决:)如果您使用的是Mongoose,那么在创建索引时可能没有使用选项{“background”:false}。当某些操作试图删除集合时,索引可能正在后台运行。将background设置为false将使索引在前台运行。使用Mongoose时的另一个解决方法是在删除集合之前调用“model.init()”。即使在后台创建索引时,这也应该有效。更多信息请访问