for循环中多个异步函数之后的NodeJS回调

2024-02-22

我从 mongodb 获取一个文档,其中包含一个带有该文档注释的数组。评论中是撰写评论的用户的 _id。

我现在需要根据用户的 _id 获取用户名,但遇到了几个问题。

我有以下代码,显然,它不起作用,但我希望它能让您了解我想要完成的任务。

//MORE CODE... (No need to show this here, just a promise, some try catch and so on)
let article = await Article.findOne({_id:articleid})   
    for(var i = 0; i<=article.comment.length-1; i++){
        User.findOne({_id:article.comment[i].user}).then((user)=>{
            article.comment[i].username = user.username
        })
    }
return resolve(article)

我查阅了几个文档,但无法找到可行的解决方案。我尝试使用 Promise.all,尝试了很多 async、await,尝试在 for 循环中添加一个计数器并在循环完成后解析 Promise,但到目前为止没有任何效果。

这就是文章在我的数据库中的样子

{
    "_id" : ObjectId("5c18c1cbc47e5e29d42e4b0e"),
    "completed" : false,
    "completedAt" : null,
    "comment" : [ 
        {
            "_id" : ObjectId("5c18c95e328c8319ac07d817"),
            "comment" : "This is a comment",
            "rating" : [ ],
            "user" : ObjectId("5c18b76e73236d2168eda2b4")
        }, 
        {
            "_id" : ObjectId("5c18fb578de5741f20a4e2bd"),
            "comment" : "Another comment",
            "rating" : [ ],
            "user" : ObjectId("5c18b76e73236d2168eda2b4")
        }
    ]
}

我对 Nodejs 和 mongodb 也很陌生,所以我希望你能帮助像我这样的新手。

感谢您的帮助


您可以根据自己的方便程度使用多种方法

使用异步等待

let article = await Article.findOne({ _id: articleid }).lean().exec()

await Promise.all(
  article.comment.map(async(obj) => {
    const user = await User.findOne({ _id: obj.user })
    obj.username = user.username
  })
)

console.log(article)

Using $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合3.6

既然mongodb有自己强大的$lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合运算符连接多个集合,可能是无需任何迭代的更好方法

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "let": { "userId": "$comment.user" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$$userId", "$_id"] }}}
    ],
    "as": "comment.user"
  }},
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])

Using $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合3.4

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "localField": "comment.user",
    "foreignField": "_id",
    "as": "comment.user"
  }}
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for循环中多个异步函数之后的NodeJS回调 的相关文章

随机推荐

  • 从深度缓冲区读取深度值的有效方法

    对于我的算法 我需要能够访问深度缓冲区 我使用 glReadPixels 执行此操作完全没有问题 但读取 800x600 窗口的速度非常慢 从 300 fps 到 20 fps 我读了很多关于这方面的内容 我认为将深度缓冲区转储到纹理会更快
  • 在 Jenkins 上构建 Android Studio 项目? android.compileSdkVersion 丢失

    我正在尝试建立我的第一个 Android 项目来构建在 Jenkins 上 我正在运行 Jenkins 1 6 2 和 Gradle 插件版本 1 24 在 Windows 7 Professional SP1 上运行 我已经在我的构建机器
  • C# 中的 Base64 对象反序列化

    我有这样的课程 Serializable public class ExternalAccount public string Name get set 我已将其转换为 JSON 如下所示 Name XYZ 然后我对 JSON 字符串进行了
  • Dagger 生成改造拦截器的多个实例

    我是 Dagger 和 Retrofit 的新手 我遇到的问题是 尽管在 dagger 模块中声明了单例 但仍生成了多个改造自定义拦截器实例 我只需要一个实例 匕首模块 Module public class ApiModule priva
  • 如何根据内容调整 DIV 宽度

    我有一个带有附加样式的 div 元素 mypost border 1px solid Peru font family arial margin auto min width 700px width 700px 我正在 DIV 块内显示 W
  • Xamarin Forms:如何更改 Android 中的工具栏高度?

    我有一个使用 Toolbar 的 XF 应用程序 它已添加到我的 ContentPage 中 如下所示 public HomePage InitializeComponent var toolbarItem new ToolbarItem
  • 在 VB.NET 中使用模块是否被认为是不好的做法?

    在设计新应用程序期间 我想知道使用具有属性的模块是否被认为是一种不好的做法 一些示例代码 Module modSettings public property Setting1 as string public property Datab
  • Flask 应用程序在 Heroku 上失败:没有名为 app 的模块

    我有一个 Flask 应用程序已部署到 Heroku 但出现错误 2018 08 27T12 39 32 197715 00 00 heroku router at error code H10 desc App crashed metho
  • strtotime(PHP日期函数)的算法如何工作?

    我想知道怎么做斯特托时间 php 日期函数 工作吗 如何解析字符串像 2012 年 9 月 15 日 到时间戳 有没有更好的算法 我的目的是改变波斯语的这个功能 您可以浏览PHP的源代码 https github com php php s
  • 客户端-服务器代码应该写在一个还是两个“项目”中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经开始开发客户端 服务器应用程序 起初 我自然地在 Eclipse 中创建了两个项目 两个源代码控制存储库等 但我很快发现两者之间有一些共享
  • iPhone SDK 4 中针对多个平台

    我有一个 iPhone SDK 项目 该项目应该为模拟器和 ARM 处理器构建一个静态库 然后将两者组合成一个通用库 到目前为止 我使用的是 iPhone SDK 3 并通过为每个模拟器和一个 ARM 创建一个单独的目标 然后使用 shel
  • $广播到当前范围

    作为前言 我有一个 Ionic 应用程序通过 websocket 连接到 Node 服务器 而 Node 服务器通过 TCP 套接字连接到 C 应用程序 我有这项服务连接并提供套接字服务 但也监视nack响应 以便它可以发出警报 通知用户错
  • 从 RGB 格式的文件加载位图(无 Alpha)

    我只想加载 BMP 文件并获取 24 位 RGB 格式 或 32 位 RGB 格式 的位图对象 我尝试的所有方法都返回 PixelFormat Format32bppArgb 的位图 图像对象 当然 即使 BMP 没有 alpha new
  • 如何通过 SSH 运行 php 脚本? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个相当长的 php 脚本 每当我的互联网连接中断一秒钟时 浏览器似乎就会停止该脚本 我不能等待 8 个小时来运行我的脚本 所以我想我可以通过 s
  • “dispatch()”是什么意思/做什么,为什么当我们有 .then() 和 .catch() 时使用它

    我是 ES6 和高级 javascript 新手 我见过使用 axios http 客户端的代码示例 如下所示 axios xxx then res gt dispatch success res err gt dispatch error
  • 哪个函数在堆栈使用效率和时间方面最好

    我编写了 3 个函数来计算元素在列表中出现的次数 我尝试了各种输入并对其进行了分析 但我仍然不知道哪个函数在堆栈使用效率和时间效率方面是最好的 请帮帮我 Using an accumulator defn count instances1
  • OpenCL - 将树复制到设备内存

    我用 C 代码实现了二叉搜索树 我的每个树节点如下所示 typedef struct treeNode int key struct treeNode right struct treeNode left treeNode t 宿主建造的树
  • NSCollectionView 取消多选

    所以我现在已经对这个主题进行了相当多的调查 但还没有发现任何与之相关的有用信息 我的问题是我创建了一个 NSCollectionView 它的作用类似于图像处理程序 因此您可以在其中放置图像 一次选择一个甚至多个图像 并根据需要删除它们 选
  • 如何在redshift中生成12位唯一编号?

    我的表中有 3 列 即email id rid final id 规则rid and final id If the email id有对应的rid use rid as the final id If the email id没有对应的r
  • for循环中多个异步函数之后的NodeJS回调

    我从 mongodb 获取一个文档 其中包含一个带有该文档注释的数组 评论中是撰写评论的用户的 id 我现在需要根据用户的 id 获取用户名 但遇到了几个问题 我有以下代码 显然 它不起作用 但我希望它能让您了解我想要完成的任务 MORE