MongoDB:存储过程

Dmi*_*try 1 mongodb

正如我所听到的,mongoDB可以存储内部程序.

我怎么用呢?

官方帮助很短.

我可以使用存储过程吗?在这一层实现小逻辑?

与Postgres pl/pgSQL相同.

Sam*_*aye 5

重复的问题(MongoDB Stored Procedure Equivalent)确实解释了您可以在MongoDB中存储可以通过eval()命令调用的过程,但是,它并没有真正解释为什么这是一件坏事.

Eval可以直接访问一个几乎不受限制的JS环境,该环境是从MongoDB的C++代码调用的.很高兴还提到通过非转义参数注入非常容易.

它们不是在MongoDB自己的运行时内工作的存储过程(与您正在考虑的存储过程不同),JS引擎是从MongoDB运行的,MongoDB不是用JS编程的; 它是用C++编程的.

它们只能从JS上下文中获得,而不是来自MongoDB的C++上下文.

默认情况下,即使使用nolock选项set,它们也可以进行全局锁定,这完全取决于您调用的操作,与本机MongoDB运行时相比,JS本身非常慢.

因此:

我可以使用存储过程吗?在这一层实现小逻辑?

不.它实际上是在第三层实现的,与MongoDB分开.

MongoDB旨在从客户端运行这些东西,有90%的可能性通过使用"存储过程"不会获得任何实际好处.实际上,在许多ACID数据库中,它们被严重滥用并以这样的方式使用,实际上减慢了应用程序的速度并使它们更容易出现故障.因此,您需要仔细考虑是否真的"需要"它们.