sql >> データベース >  >> NoSQL >> MongoDB

forループ内の複数の非同期関数の後のNodeJSコールバック

    利便性に基づいて、ここで使用できるサーバーアプローチがあります

    非同期待機の使用

    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)
    

    $ lookupを使用する 集計3.6

    mongodbには独自の強力な $ 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" }
      }}
    ])
    

    $ 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" }
      }}
    ])
    


    1. MongoDB Aggregation:合計レコード数を取得する方法は?

    2. MongoDB dropIndexes()

    3. ネストされたドキュメントのフィールドのマングースインデックス

    4. MongoDB $ replaceOne