2016-04-01 50 views
2

我有一個Node,Express和使用骨幹的設置。一切工作正常,我能夠從MongoDB集合中檢索記錄,當它們很簡單時,例如通過id或所有員工獲取員工。我聽唔明您是如何從MongoDB中需要更復雜的查詢語法類似下面的集合:如何使用MongoDB執行`has many`關聯的查詢

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); 
     }); 
    }); 
}; 

回答

0

MongoDB的聚集管道要求您在傳遞數組的操作。這意味着正確的查詢將是:

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

    res.jsonp(managers); 
    }); 

你會發現細節使用與這裏的MongoDB的NodeJS司機聚集管道:https://docs.mongodb.org/getting-started/node/aggregation/

+0

謝謝。我得到它的工作,但有一些奇怪的。當我在robomongo中運行我的MongoDB腳本時,我得到了正確的結果集,這是管理員的員工列表。因此,所有經理都列出,然後嵌套都是向他們報告的所有員工。但是當我在上面的代碼中使用相同的確切語法時,我得到的結果集只是我集合中的所有記錄,就好像我的MongoDB腳本被忽略了一樣。爲什麼會這樣? –

+0

您在RoboMongo中執行了哪些代碼? – gnerkus

+0

我想我現在明白你的問題。 MongoDB客戶端(通過RoboMongo)和MongoDB的Node.js驅動程序的語法不同。雖然客戶端需要這種形式的查詢:'db.employees',Node.js驅動程序需要以這種形式查詢:'db.collection('employees')' – gnerkus

相關問題