javascript - 如何使用 promise 和循环 mongoose 集合

标签 javascript node.js mongoose

我正在我的网站内进行聊天。为了存储数据,我使用聊天、用户、消息集合。

我希望结果在数组中包含:

[{
  username (another one, not me)
  last update
  last message
}] 

在聊天模型中,我只有 chatid两个成员的数组,所以我需要循环访问 User 集合以获取 user name 使用用户 id 来自它。我想在数组中保存所有名称(将来我还想遍历消息以获取每个 chatid 的最新消息)。问题是当我返回 chatsList 时它是空的。我想我需要以某种方式使用 Promise,但我不完全确定它应该如何工作。

Chat.find({ members: userId })
    .then(chats => {
      let chatsList = [];
      chats.forEach((chat, i) => {
        let guestId = chat.members[1 - chat.members.indexOf(userId)];
        User.findOne({ _id: guestId })
          .then(guest => {
            let chatObj = {};
            name = guest.name;
            chatsList.push(name);
            console.log("chatsList", chatsList)
          })
          .catch(err => console.log("guest err =>", err))
      })
      return res.json(chatsList)
    })
    .catch(err => {
      errors.books = "There are no chats for this user";
      res.status(400).json(errors);
    })

最佳答案

确实,Promise.all是你要找的:

Chat.find({ members: userId })
    .then(chats => {
        let userPromises = [];
        chats.forEach((chat, i) => {
            let guestId = chat.members[1 - chat.members.indexOf(userId)];
            userPromises.push(User.findOne({ _id: guestId }));
        });
        return Promise.all(userPromises).then(guests => {
            let chatsList = [];
            guests.forEach(guest => {
                chatsList.push(guest.name);
            });
            return res.json(chatsList);
        });
    });
});

尽管使用 ID 列表($in 查询)对 DB 进行一次调用可能会更好。像这样:

Chat.find({ members: userId })
    .then(chats => {
        let ids = [];
        chats.forEach((chat, i) => {
            let guestId = chat.members[1 - chat.members.indexOf(userId)];
            ids.push(guestId);
        });
        return User.find({_id: {$in: ids}}).then(guests => {
            let chatsList = [];
            guests.forEach(guest => {
                chatsList.push(guest.name);
            });
            return res.json(chatsList);
        });
    });
});

您可能还想验证每个 id 是否都有对应的 guest

关于javascript - 如何使用 promise 和循环 mongoose 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259178/

相关文章:

javascript - 如何从字符串中删除选定的单词

javascript - 您将如何在 firestore 中保存和读取数组?

javascript - 一段时间后,socket io 开始在我的原始聊天室上发布两次内容

javascript - Uncaught TypeError rendering <Router> 在 ES6 : type. toUpperCase 中使用 React Router 不是函数

node.js - 不支持查询关键条件: Already have a Hash and a Range Key

javascript - 无法填充嵌套数组

Node.js 无法从 Heroku 连接到 mongodb 3 到 Mongolab : SCRAM-SHA-1

javascript - 平均JS : setting Mongoose object reference in array in Angular

javascript - 我有一个数字,我想在 jquery 数组中获取小于和大于的最接近的数字

javascript - Angular 2获取组件之间的动态值