【发布时间】:2015-02-10 00:32:08
【问题描述】:
据我所知,mongoDB 可以存储内部过程。
我该如何使用它?
官方帮助很短。
我可以使用存储过程吗?在这一层实现小逻辑?
与 Postgres pl/pgSQL 相同。
【问题讨论】:
-
不要尝试,它们不是 SQL 数据库中的存储过程
标签: mongodb
据我所知,mongoDB 可以存储内部过程。
我该如何使用它?
官方帮助很短。
我可以使用存储过程吗?在这一层实现小逻辑?
与 Postgres pl/pgSQL 相同。
【问题讨论】:
标签: mongodb
重复的问题 (MongoDB Stored Procedure Equivalent) 确实解释了您可以在 MongoDB 中存储一个可以通过 eval() 命令调用的过程,但是,它并没有真正解释为什么这是一件坏事。
Eval 是对从 MongoDB 的 C++ 代码调用的几乎不受限制的 JS 环境的直接访问。值得一提的是,通过非转义参数注入非常容易。
它们不是在 MongoDB 自己的运行时中工作的存储过程(与您正在考虑的存储过程不同)JS 引擎是从 MongoDB 运行的,MongoDB 不是在 JS 中编程的;它是用 C++ 编写的。
它们只能在 JS 上下文中使用,而不能从 MongoDB 的 C++ 上下文中使用。
默认情况下,即使设置了nolock 选项,它们也可以获取全局锁,这完全取决于您调用的操作,并且与原生 MongoDB 运行时相比,JS 本身非常慢。
这样:
我可以使用存储过程吗?在这一层实现小逻辑?
没有。它实际上是在第三层实现的,与 MongoDB 分开。
MongoDB 旨在从客户端运行这些东西,使用“存储过程”有 90% 的机会不会获得真正的好处。事实上,在许多 ACID 数据库中,它们被严重滥用和使用,实际上会减慢应用程序的速度并使其更容易出现故障。所以你需要非常仔细地考虑你是否真的“需要”它们。
【讨论】: