如何对查询的每个结果进行查询?

时间:2019-07-14 14:35:11

标签: node.js mongodb mongoose

我正在尝试使用MongoDB和Node.JS构建应用程序。我有3个模型:用户,乘车,参与。 参与包含一个用户ID和一个rideID。这几乎与SQL逻辑一样:参与将其他两个模型链接在一起。

我想使用一个用户ID,通过参与模型返回所有​​乘车

我尝试使用forEach,因为第一个请求返回一个数组。

router.get('/getAllRide/:userID',function(req,res){
  let userID = req.params.userID
  let return = []
  Participating.find({_idUser: userID })
  .then(participating => {
    participating.forEach(element => {
      Ride.find({_id: element._id})
      .exec()
      .then(ride => {
        retour.push(ride)})
    });
    res.status(200).json(return)
  });

在此代码的末尾,数组return为空,而它应该包含_id在参与实体中的每个Ride。

1 个答案:

答案 0 :(得分:0)

好的,这里有几个问题:

  1. return是一个关键字。您可能不应该将其用作变量名。
  2. 数据库调用是异步的。 forEach个循环是同步的。这意味着您将立即返回retour(看起来不确定)。
  3. 猫鼬具有填充嵌套关系的工具-最好不要在应用程序代码中这样做。即使您在应用程序代码中执行此操作,也最好不要遍历结果并进行新发现-相反,最好构造一个find查询以返回您需要的所有新文档。< / li>

如果您确实想在应用程序代码中执行此操作,则可以使用async/awaitPromise.all

const toReturn = [];
const findPromises = participating.map(element => {
      return Ride.find({_id: element._id})
      .exec()
      .then(result => toReturn.push(result)
});
return Promise.all(findPromises).then(() => res.status(200).json(toReturn));

(注意:如果您使用的是Bluebird,则可以不使用Promise.all,而可以使用Promise.map