【问题标题】:How to execute a query with a `has many` association using MongoDB如何使用 MongoDB 执行具有“有很多”关联的查询
【发布时间】:2016-04-01 21:42:36
【问题描述】:

我有一个使用 Node、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);
        });
    });
};

【问题讨论】:

    标签: javascript node.js mongodb express backbone.js


    【解决方案1】:

    MongoDB 的聚合管道要求您以数组的形式传递操作。这意味着正确的查询是:

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

    您可以在此处找到将聚合管道与 NodeJS MongoDB 驱动程序结合使用的详细信息:https://docs.mongodb.org/getting-started/node/aggregation/

    【讨论】:

    • 谢谢。我让它工作,但有一些奇怪的东西。当我在 robomongo 中运行我的 MongoDB 脚本时,我得到了正确的结果集,它是按经理列出的员工列表。因此,所有经理都被列出,然后嵌套的是所有向他们报告的员工。但是当我在我的代码中使用与上面相同的语法时,我得到的结果集只是我的集合中的所有记录,就好像我的 MongoDB 脚本被忽略了一样。为什么会这样?
    • 我想我现在明白你的问题了。 MongoDB 客户端(通过 RoboMongo)和 MongoDB 的 Node.js 驱动程序的语法不同。客户端需要这种形式的查询:db.employees,而 Node.js 驱动程序需要这种形式的查询:db.collection('employees')
    • 其实我想出了如何让它工作,但我不明白为什么。我需要再研究一下。但我根据您上面分享的链接想通了。我基本上必须在 node.js 中的查询周围添加方括号,所以最终的语法是:collection.aggregate([{ $group : { _id : "$managerName", employees:{$push: "$fullName" }}} ]) 所以 Gnerkus 你关于传递数组的回答是正确的并且有效。
    • 对不起,添加评论时如何格式化?不知道这是否是问这个的地方。
    • 不是,但我还是会回答:您可以使用常规降价。例如,将反引号 (``) 中的表达式括起来,使其格式看起来像 code
    猜你喜欢
    • 2018-01-28
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多