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

リンクされたオブジェクトを持つMongoDB集約パイプライン

    2番目の$addFieldsにフィルターを追加する必要があります フィルタリングするステージroomTypes 残りの段階は同じで、開始コメントと終了コメントから以下の新しいコードを強調表示します。

    • $reduce roomDetails.descriptionのループを繰り返す $ condを配列してローカルに一致させ、一致結果を値に返します。roomDetails.titleと同じプロセスです。 配列し、$mergeObjectsを使用して、この2つの更新されたフィールドを現在のオブジェクトとマージします
      {
        $addFields: {
          roomTypes: {
            $map: {
              input: "$roomTypes",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
    

    開始:

                    roomDetails: {
                      $mergeObjects: [
                        "$$this.roomDetails",
                        {
                          description: {
                            $reduce: {
                              input: "$$this.roomDetails.description",
                              initialValue: "",
                              in: {
                                $cond: [
                                  { $eq: ["$$this.locale", "pl"] },
                                  "$$this.value",
                                  "$$value"
                                ]
                              }
                            }
                          },
                          title: {
                            $reduce: {
                              input: "$$this.roomDetails.title",
                              initialValue: "",
                              in: {
                                $cond: [
                                  { $eq: ["$$this.locale", "pl"] },
                                  "$$this.value",
                                  "$$value"
                                ]
                              }
                            }
                          }
                        }
                      ]
                    },
    

    〜終了〜

                    available: {
                      $reduce: {
                        input: "$$this.capacity",
                        initialValue: 0,
                        in: {
                          $cond: [
                            { $eq: ["$$this.cruiseID", "$cruiseID"] },
                            "$$this.available",
                            "$$value"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    

    遊び場

    一般的なオプションでは、参照用の質問 で回答しました

    のような同じ機能を使用できます
    function languageFilter(inputField, locale) {
      return {
        $reduce: {
          input: inputField,
          initialValue: "",
          in: {
            $cond: [{ $eq: ["$$this.locale", locale] }, "$$this.value", "$$value"]
          }
        }
      };
    }
    

    最終的なクエリは次のようになります:

    let locale = "pl";
    db.cs.aggregate([
      { $match: { cID: "00001" } },
      {
        $lookup: {
          from: "rooms",
          localField: "roomTypes.roomID",
          foreignField: "roomID",
          as: "roomTypes"
        }
      },
      {
        $addFields: {
          title: languageFilter("$title", locale),
          description: languageFilter("$description", locale),
          roomTypes: {
            $map: {
              input: "$roomTypes",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    roomDetails: {
                      $mergeObjects: [
                        "$$this.roomDetails",
                        {
                          description: languageFilter("$$this.roomDetails.description", locale),
                          title: languageFilter("$$this.roomDetails.title", locale)
                        }
                      ]
                    },
                    available: {
                      $reduce: {
                        input: "$$this.capacity",
                        initialValue: 0,
                        in: {
                          $cond: [
                            { $eq: ["$$this.cruiseID", "$cruiseID"] },
                            "$$this.available",
                            "$$value"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      },
      {
        $project: {
          _id: 0,
          "roomTypes": { _id: 0 },
          "roomTypes.capacity": 0
        }
      }
    ]);
    



    1. MongoDBデータベーススキーマの設計

    2. mongodb findOne with Explain

    3. MongoTemplateを使用してソートされた個別の値を取得します

    4. MongoDBクエリ結果をJSONファイルにエクスポートする方法