【问题标题】:how to loop over an array and get data for each element? - with mongoose & node.js如何遍历数组并获取每个元素的数据? - 使用猫鼬和 node.js
【发布时间】:2022-01-20 02:38:28
【问题描述】:

我正在尝试建立一个社交网络。我有一个“连接”/“朋友请求”的集合。 架构如下:

  {
    senderId: { type: String },
    receiverId: { type: String },
    approved: { type: Boolean },
  },

当此人尚未批准连接时,连接将标记为“待处理”。 当用户进入网站时,我会使用以下命令获取人们发送给他的所有待处理连接:

    const requestsPending = await Connection.find({
      receiverId: userId,
      approved: false,
    });

问题是,在后端,我想获取发送好友请求的人的详细信息(这样我就可以显示他们的姓名+图片)。 我想遍历挂起的请求数组,并获取发送请求的用户的额外数据。

  await User.findById(requestsPending[0][senderId]);

知道如何为每个元素执行此操作吗?最好的方法是什么? 或者知道如何更有效地做到这一点?

谢谢。

【问题讨论】:

    标签: node.js mongodb asynchronous mongoose backend


    【解决方案1】:

    这似乎有效:

    var requestsPendingWithUsersData = await Promise.all(
      requestsPending.map(async (item) => {
        const userData = await User.findById(item.senderId);
        return {
          item,
          senderData: { picture: userData.picture, name: userData.username },
        };
      })
    );
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
    【解决方案2】:
    await User.find({
    'senderId': { $in: [
        101,102,103,...
        ]}
    })
    

    您可以尝试类似上面的方法,将一个 senderID 数组传递给 $in。 $in 子句类似于 SQL 中的 like 运算符。

    如果 senderId 是 ObjectId,则将它们作为 ObjectID 类型传递

    await User.find({
    'senderId': { $in: [
        mongoose.Types.ObjectId(<senderID>),
        ]}
    })
    

    如果 mongo 文档更重/更大,请在查询末尾使用 lean()。启用精益选项会告诉 Mongoose 跳过实例化完整的 Mongoose 文档。

    await User.find({
    'senderId': { $in: [
        101,102,103,...
        ]}
    }).lean()
    

    【讨论】:

    • 谢谢。与我找到的解决方案相比,它看起来更有效。我的问题是,如果从查询中获得了所有相关的朋友,那么在相应的朋友请求中包含“正确”朋友的最佳方式是什么?我将有两个不同的数组。好友请求和好友数据。将它们结合起来的最佳方法是什么?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2018-08-26
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多