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