我正在使用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,或者从服务器获取信息并执行处理/过滤/等等在客户端。
[我的问题]
在查询期间不允许提供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,请参阅原始帖子。