Mongodb传递代码在查询期间在服务器上执行

时间:2018-05-04 09:00:55

标签: node.js mongodb aggregation

我正在使用mongodb,我正在尝试查询集合,并接收过滤有序投影结果。遗憾的是,我想要实现的逻辑是复杂的,即使我们假设可以使用db.collection.aggregate,它也会导致长而复杂,难以读取的聚合描述符,我相信在大多数情况下这是不需要的。

所以我在想 - Mongodb理解javascript,因此我很可能在查询过程中传递一个javascript函数,期望我的mongo服务器会进行查询,运行提供的函数将查询结果传递给它,然后返回最后的结果给了我。类似的东西:

db.collection.find(myQuery, serverCallback).toArray(function(err, db) { ... });

可悲的是,这似乎是不可能的。进一步调查我到达stored javascript并且理解我可以在服务器上定义该serverCallback而不是传递它。哪个好,但对我来说似乎很乱。所以基本上就是这个原因,为什么我决定在这里问一下,如果有更好的mongodb经验的人可以论证这种方法。

[我的理解]

我相信并非所有过滤,聚合等都可以通过db.collection.aggregate实现,这很正常。对于需要特殊方式过滤查询结果的所有情况,我们有两个选项 - 定义我们在mongo服务器上的查询结果上执行的存储javascript,或者从服务器获取信息并执行处理/过滤/等等在客户端。

  • 如果我们选择定义存储的javascript,我们很可能会在mongo服务器中定义一些项目特定的逻辑。我认为项目细节应该始终属于项目代码而不是数据库。这样我们就可以使用git对它们进行版本化,如果我们想要更改它们,可以轻松访问它们。
  • 如果我们选择在查询后应用聚合逻辑,我们就会失去选择谁来进行计算的能力 - 服务器或客户端。这可能是我们想要的意见。

[我的问题]

在查询期间不允许提供serverCallback的原因是什么?我相信我必须有理由不明白。

[编辑]

首先,我想说我已经解决了我的问题,因为它太复杂而无法轻易解释。我宁愿坚持更容易解释和理解的东西。我相信MongoDB存储javascript的this示例提供了很好的示例,所以让我们使用它。基本上我上面试过的是有没有办法在 db.collection.find 期间传递这个sum函数(以及为什么没有)。像这样:

function sum(queryResultAsArray) {
    //Do whatever we want with queryResultAsArray
    //For the example we filter result rows with x + y == 6;
    return queryResultAsArray.filter(function(row) {
        return row.x + row.y == 6
    });
}
db.test.find({}, queryResultAsArray);

这与示例相同:

db.test.find({$where: "sum(this.x, this.y) == 6"});

为了推理为什么人们可以更喜欢传递函数而不是存储的javascript,请参阅原始帖子。

0 个答案:

没有答案