MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB tổng hợp các đường ống với đối tượng được liên kết

Bạn chỉ cần thêm bộ lọc trong $addFields thứ hai của mình giai đoạn mà bạn đang lọc roomTypes và phần còn lại của các giai đoạn sẽ giống nhau, chỉ cần đánh dấu mã mới ở bên dưới từ nhận xét bắt đầu và nhận xét kết thúc,

  • $reduce để lặp lại vòng lặp của roomDetails.description mảng $ cond để đối sánh cục bộ và trả về kết quả đối sánh thành giá trị, cùng một quy trình cho roomDetails.title mảng và hợp nhất 2 trường đã cập nhật này với đối tượng hiện tại bằng cách sử dụng $mergeObjects
  {
    $addFields: {
      roomTypes: {
        $map: {
          input: "$roomTypes",
          in: {
            $mergeObjects: [
              "$$this",
              {

Bắt đầu:

                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"
                            ]
                          }
                        }
                      }
                    }
                  ]
                },

~ Hết ~

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

Sân chơi

Trong tùy chọn chung, tôi đã trả lời trong câu hỏi tham khảo của bạn bạn có thể sử dụng chức năng tương tự như,

function languageFilter(inputField, locale) {
  return {
    $reduce: {
      input: inputField,
      initialValue: "",
      in: {
        $cond: [{ $eq: ["$$this.locale", locale] }, "$$this.value", "$$value"]
      }
    }
  };
}

Truy vấn cuối cùng của bạn sẽ là:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Đổi tên trường kiểu phức hợp nằm trong mảng

  2. Tại sao các tên khóa được lưu trữ trong tài liệu trong MongodDB

  3. Chuẩn hóa dữ liệu trong MongoDB

  4. Aggregate $ lookup không trả về thứ tự mảng ban đầu của các phần tử

  5. Các truy vấn tổng hợp trung bình trong Meteor