Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB使用链接对象聚合管道_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB使用链接对象聚合管道

MongoDB使用链接对象聚合管道,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在一个查询中链接两个对象并使用聚合函数。有些数据是本地化的,我正在使用中的解决方案来获取指定区域设置的数据 对于链接对象(房间)中的数据,我也很难做到这一点。具体来说,从roomDetails中列出给定区域设置的数据 请看一下您只需要在您正在筛选的第二个$addFields阶段中添加过滤器房间类型,其余阶段将相同,只需在下面的开始注释和结束注释中突出显示新代码 我建议在您实现的查询中使用此解决方案,我不确定这样做是否正确,可能会导致查询的性能更高 $reduce迭代roomDetails的循

我在一个查询中链接两个对象并使用聚合函数。有些数据是本地化的,我正在使用中的解决方案来获取指定区域设置的数据

对于链接对象(房间)中的数据,我也很难做到这一点。具体来说,从roomDetails中列出给定区域设置的数据


请看一下您只需要在您正在筛选的第二个
$addFields
阶段中添加过滤器
房间类型
,其余阶段将相同,只需在下面的开始注释和结束注释中突出显示新代码

我建议在您实现的查询中使用此解决方案,我不确定这样做是否正确,可能会导致查询的性能更高

  • $reduce
    迭代
    roomDetails的循环。description
    数组$cond匹配本地并将匹配结果返回值,与
    roomDetails的过程相同。title
    数组,并使用
    $mergeObjects
开始:

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

                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
    }
  }
]);

既然你问了这个问题,而且这是一个解决方案,为什么不接受呢?我来看看我正在努力将你的解决方案应用到另一个地方。您是否愿意看看这个mongo游乐场?并提出解决方案?您是否在寻找这个
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
    }
  }
]);