nodejs如何执行原始mongo查询字符串

时间:2014-02-22 04:09:12

标签: node.js mongodb mongoose

我正在使用nodejs和mongoose。

另一个函数将为我提供一个原始的mongodb查询作为字符串,我需要直接在数据库上执行它并传回结果。

我需要的是类似于在mysql连接对象上执行mysql查询字符串,但我不知道如何为mongo执行此操作。请帮忙。

我不知道模型,查询可以是任何东西。这是主要问题。甚至类似 节目集 的内容在此处有效。

我知道这会使SQL容易受到SQL注入,但在这种情况下这不是问题,所以不用担心。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你试图从某个界面(网页或其他东西)获取mongo命令,在服务器上运行它并发回结果。

所以从本质上讲,你正在尝试模拟mongo shell。一种方法可能是使用mongo的--eval命令行参数。

  1. 对于此类型的每个请求,生成一个新节点子节点,运行mongo --eval <your command in quotes>并继续从父节点中的子节点监听stdout事件(child.stdout.on('data',cb)) ,并将结果数据转储到客户端。

  2. 您还可以将javascript文件作为参数传递给mongo命令。这意味着您可以将mongo查询转储到临时js文件,使用mongo命令在子进程中执行该文件并转储结果。

答案 1 :(得分:0)

我知道这里有一个答案以某种形式使用eval(),我在你添加的评论中看到你期望字符串信息。但如果我强烈阻止你这样做,我会这样做。

实际上你被要求产生一个mongo shell,虽然它很新颖,但可能不会很实用。

但在您 达到 eval()的内部用法之前,我建议您在网上阅读并注意警告。

在我链接的表单中,这将触发任意JavaScript到您的服务器并在那里运行结果。安全性和锁定存在问题,而且与采用这种方法有关。

相反,如何创建自己的API层以获取序列化参数。因此,不要将整个命令存储在字符串中,只需调用端点来说明 find()并处理参数。

{ 
    collections: <collection>,
    query: <query_condition>,
    project: <projection>,
    options: <options>
}

或任何适合你的结构。在那里,您甚至可以在字符串中使用JSON表单,您可以使用它来反序列化为代码的数据。

这对我来说似乎更合乎逻辑,更安全,然后直接以您提出的形式发送命令。因此可能更多类似于通过网络发送SQL语句作为文本。