Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用MongoDB执行具有`has many`关联的查询_Javascript_Node.js_Mongodb_Express_Backbone.js - Fatal编程技术网

Javascript 如何使用MongoDB执行具有`has many`关联的查询

Javascript 如何使用MongoDB执行具有`has many`关联的查询,javascript,node.js,mongodb,express,backbone.js,Javascript,Node.js,Mongodb,Express,Backbone.js,我有一个节点、Express和使用主干的设置。一切正常,我能够从MongoDB集合中检索记录,而这些记录很简单,比如通过id获取员工或所有员工。我很难理解的是,如何从MongoDB获取需要更复杂查询语法的集合,如下所示: db.employees.aggregate( [ { $group : { _id : "$managerName", employees: { $push: "$fullName" } } } ] ) 目前,我有以下语法来提取要作为json对象公开的

我有一个节点、Express和使用主干的设置。一切正常,我能够从MongoDB集合中检索记录,而这些记录很简单,比如通过id获取员工或所有员工。我很难理解的是,如何从MongoDB获取需要更复杂查询语法的集合,如下所示:

db.employees.aggregate(
   [
     { $group : { _id : "$managerName", employees: { $push: "$fullName" } } }
   ]
)
目前,我有以下语法来提取要作为json对象公开的数据,并绑定到html页面中的元素

exports.findById = function(req, res) {
    var id = parseInt(req.params.id);
    db.collection('employees', function(err, collection) {
        collection.findOne({'id': id}, function(err, item) {
            res.jsonp(item);
        });
    });
};
我想获得所有经理及其下属员工的列表,然后以某种方式将此结果集绑定到将经理列为列表标题的各个div,然后将所有向其下属的员工列为列表项。结果集基本上由父母和孩子组成。我想使用backbonejs动态执行此操作

我会做类似的事情吗

exports.findRelations = function(req, res) {
    db.collection('employees', function(err, collection) {
        collection.aggregate({ $group : { _id : "$managerName", employees:{$push: "$fullName" } } }, function(err, item) {
            res.jsonp(item);
        });
    });
};

MongoDB的聚合管道要求在数组中传递操作。这意味着正确的查询将是:

db.collection('employees').aggregate([
    { $group : { _id : "$managerName", employees:{$push: "$fullName" } }
  ])
  .toArray(function(err, managers){
    if (err){
      throw err;
    }

    res.jsonp(managers);
  });

您可以在此处找到将聚合管道与NodeJS MongoDB驱动程序一起使用的详细信息:

谢谢。我让它工作了,但有点奇怪。当我在robomongo中运行MongoDB脚本时,我得到了正确的结果集,即经理列出的员工列表。因此,列出所有经理,然后嵌套向其报告的所有员工。但是,当我在代码中使用与上面相同的语法时,我得到的结果集只是集合中的所有记录,就好像我的MongoDB脚本被忽略一样。为什么?我想我现在明白你的问题了。MongoDB客户端(通过RoboMongo)和MongoDB的Node.js驱动程序的语法不同。虽然客户端需要以下形式的查询:
db.employees
,但Node.js驱动程序需要以下形式的查询:
db.collection('employees')
实际上我知道了如何使其工作,但我不明白为什么。我需要进一步研究一下。但我是根据你上面分享的链接猜出来的。基本上,我必须在node.js中的查询周围添加方括号,所以最后的语法是:collection.aggregate([{$group:{u id:{$managerName],employees:{$push:$fullName“}}}}]),所以Gnerkus您关于传递数组的响应是正确的,并且有效的。很抱歉,但是在添加注释时如何格式化?不确定这是否是问这个问题的地方。不是,但我会回答:你可以使用常规降价。例如,用倒钩(``)环绕表达式,将其格式化为
code