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

同じコレクションのすべてのドキュメントの配列のオブジェクトに存在するIDに基づいてリストをフィルタリングするためのMongoDb集計

    試すことができます

    • $facet 2つの配列を作成するには、users ユーザーの詳細名とstudentId、2番目にallUsersのすべてのユーザーの詳細
    • $project ループを繰り返す
      • $map allUsers配列として入力
      • $map 学生として入力参照配列
      • $map 学生の配列として入力
      • $reduce usersから学生のデータを取得する 条件が一致した場合の配列
    • $unwind allUsers配列を分解します
    • $replaceWith ルート内のallUsersオブジェクトを置き換えます
    db.collection.aggregate([
      {
        $facet: {
          users: [
            {
              $project: {
                studentId: 1,
                name: 1
                // add fields as you want it will automatically reflect in join
              }
            }
          ],
          allUsers: []
        }
      },
      {
        $project: {
          allUsers: {
            $map: {
              input: "$allUsers",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    studentsReffered: {
                      $map: {
                        input: "$$this.studentsReffered",
                        in: {
                          $mergeObjects: [
                            "$$this",
                            {
                              students: {
                                $map: {
                                  input: "$$this.students",
                                  as: "s",
                                  in: {
                                    $reduce: {
                                      input: "$users",
                                      initialValue: { studentId: "$$s.studentId" },
                                      in: {
                                        $cond: [
                                          { $eq: ["$$this.studentId", "$$s.studentId"] },
                                          "$$this",
                                          "$$value"
                                        ]
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      },
      { $unwind: "$allUsers" },
      { $replaceWith: "$allUsers" }
    ])
    

    遊び場




    1. $elemMatchによってmongodbの2つのサブ配列値を抽出します

    2. nodejsでMongoDBクエリ結果をストリーミングする方法は?

    3. 一定時間後にノードアプリが応答しなくなる

    4. リアルタイムで追加されるRedisからオブジェクトをポップするにはどうすればよいですか?