nodejs在回调中嵌套查询

时间:2016-01-29 18:38:08

标签: json node.js mongodb nested

我发现了许多一对多的关系示例,但我还没有找到一个非常明确的例子来解决嵌套查询中的标准化数据的问题。或者只是我的头脑粗壮。请帮忙。 我关注的是' User',' Account' '图书馆&#39 ;.

User: { 
  name: String,
  password: String //Hash of course
}

Library: { 
  name: String,
  address: String
}

Account: { 
  user_id: String,
  library_id: String
}

这是因为用户拥有多个具有各种库的帐户(我绝对可以将它们嵌入到'帐户'文档中的用户文档或库信息中)。 我尝试编写代码(参见下面的代码段)将所有文档放在一起作为一个JSON对象数组,如下所示,但我不清楚如何或在何处返回响应,如&# 34; res.json(allaccountsdata)"或者可能有更好的方法?

function isLoggedIn() { 
  // this validates the user and puts user object in the req
}

app.get('/account', isLoggedIn, function(req, res) {
  var allaccountsdata = [];
  Account.find({user_id: req.user._id}, function(err, accounts) {
    account.forEach(function(account) {
      Library.find({_id: account.library_id}, function(err, library) {
        account.library = library;
        allaccountsdata.push(account); // Where do I return this???
      });
    }); 
  });
});

我知道这不是非常有效而且不是真正的mongodb方式,但我只是想了解如果我的数据在mongodb中都被标准化了怎么做。

-Atarangp

1 个答案:

答案 0 :(得分:0)

您可以在查询中查询多个项目。使用库ID构造一个列表,并使用它来查找所有库。未经测试的例子:

Account.find({user_id: req.user._id}, function(err, accounts) {
  // Get an array with the library IDs
  var libraryIds = accounts.map(function(account) {
    return account.library_id;
  });
  // Find all relevant libraries in one query
  Library.find({_id: {$in: libraryIds}}, function(err, libraries) {
    // Join the libraries to the accounts
    accounts.forEach(function(account) {
      account.library = libraries.find(function(library) {
        return library.id === account.library_id;
      });
    });
    return res.json(accounts);
  });
});