Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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创建原子存储过程/“存储JS”_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用MongoDB创建原子存储过程/“存储JS”

Node.js 使用MongoDB创建原子存储过程/“存储JS”,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我们需要在MongoDB数据库中创建一个原子例程 我们需要遍历一个集合,从集合中的所有文档中找到给定字段的最大值,然后递增它。我们正在处理一些需要集成的遗留数据,否则我们就已经有了一些原子序列 我如何在MongoDB中创建存储JS或存储过程,以原子方式运行整个例程 我看到了一些信息,但对我来说没有什么特别清楚: 我在哪里可以找到好的信息,如何实际编写在MongoDB中运行的原子/阻塞存储过程,以及如何从应用程序中实际调用存储过程?总结上述评论 目前,mongodb中没有任何东西允许您运行任意逻辑

我们需要在MongoDB数据库中创建一个原子例程

我们需要遍历一个集合,从集合中的所有文档中找到给定字段的最大值,然后递增它。我们正在处理一些需要集成的遗留数据,否则我们就已经有了一些原子序列

我如何在MongoDB中创建存储JS或存储过程,以原子方式运行整个例程

我看到了一些信息,但对我来说没有什么特别清楚:

我在哪里可以找到好的信息,如何实际编写在MongoDB中运行的原子/阻塞存储过程,以及如何从应用程序中实际调用存储过程?

总结上述评论

目前,mongodb中没有任何东西允许您运行任意逻辑,例如,包括多个查询以原子方式收集数据

mongodb提供的最好的原子功能是。它的原子性自然仅限于一个文档,并且您的文档列表非常有限,也就是说,您甚至不能使用文档的字段,就像定期更新一样


使用应用程序级锁在某种程度上是可能的:应用程序插入或修改一个特殊的锁文档,这将向我正在使用/更新的应用程序的其他部分发出信号,请不要触摸它。操作完成后,应用程序释放锁,所以现在可以自由地被其他人重新获取。当然,这完全依赖于参与者遵守锁协议,委婉地说,锁协议不太可靠。

mongodb中没有原子/阻塞存储过程。findAndModify可能会让您想做什么,但这确实很难说,因为您的描述非常模糊,而b仅在文档级别是原子级的。@SergioTulentsev这根本不是一个模糊的问题,我准确地描述了我想做的事情:好吧,我想做的更准确些,就是创建一个存储过程,它可以在文档上创建一个锁,并在存储过程的生命周期中保持该锁。是的,不会发生:我写了这个,如果你对真正的ACID db感兴趣,你不必同意遵守规则。这些规则由数据库强制执行。只是说说而已如果这对您有效,那么很好,我在这里的工作已经完成了:TTL索引用于MongoDB的锁定,但我不知道它们到底有多好work@AlexanderMills:您引用的幻灯片组中的TTL索引仅用于确保在您的程序因任何原因在正常释放锁之前崩溃时释放锁。除此之外,它们与锁定没有任何关系。不,不是真的,锁持有者通过使用ttl设置索引来获取锁,当锁持有者完成时,锁持有者删除索引,系统不必等到索引到期..其他锁请求者使用轮询来获取锁,当他们成功创建索引时,他们获得锁,当他们完成时,他们删除它。ttl只是应用程序宕机时所需的关键特性。这是一个糟糕的锁定系统,因为它需要大量的轮询,但它会工作。@AlexanderMills:你说他们创建索引是什么意思?在这种情况下,运行时不会动态创建/删除索引,我向您保证:@亚历山大·米尔斯:是的,我同意。