mongodb Nestjs中不同语言数据的聚合代码
mongodb aggregations code for different language data in Nestjs
我的数据库
{
"_id": {
"$oid": "ddfsfs"
},
"id": 3,
"parent_id": 6,
"translation":
[
{
"language": "en",
"desc": "prod detail",
"name": "example1"
},
{
"language": "tr",
"desc": "detaylar",
"name": "ornek1"
}
]
}
我想做这个:
例如,只选择英文字段。如果它的最终形式只有英文字段中的名称和描述可以吗?以及如何?
{
"_id": {
"$oid": "ddfsfs"
},
"id": 3,
"parent_id": 6,
"desc": "prod detail",
"name": "example1"
}
或者数据库可以这样。再次只保留英文字段
{
"_id": {
"$oid": "62189ffd81f6b6bb05d8d409"
},
"id": 7,
"parent_id": 8,
"en": {
"desc": "hii",
"name": "serial ethernet"
},
"tr": {
"desc": "merhaba",
"name": "seri ethernet"
}
}
请分享我 mongodb 用于 nestjs 的聚合代码。谢谢!:)
对于第一个数据库模式,您需要一个管道,该管道将首先使用 $filter
运算符过滤 translation
数组。这将 return 一个仅包含满足过滤条件的文档的数组。所以表达式:
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} }
产生结果
[
{
"language" : "en",
"desc" : "prod detail",
"name" : "example1
}
]
第二步是将上述文档与您需要的 top-level 字段合并,在这种情况下,您希望 _id、id 和 parent_id 字段与上面的合并。为此使用 $mergeObjects
。
由于$mergeObjects
需要文档作为输入,您需要使用$arrayElemAt
或$first
运算符从数组中获取文档前一个 $filter
表达式,即
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
{ $first: {
$filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
}
} }
将return
{
"language" : "en",
"desc" : "prod detail",
"name" : "example1
}
现在您可以使用表达式
{
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
]
}
获得
{
"_id" : ObjectId("6218abb521d9a0dfecd02e4b"),
"parent_id" : 6.0,
"language" : "en",
"desc" : "prod detail",
"name" : "example1"
}
最后一步是将根替换为运算符 $replaceRoot
and your final aggregate pipeline Try the following aggregate pipeline (MongoDb Playground) 应该如下所示
{ $replaceRoot: {
newRoot: {
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
]
}
} }
对于替代模式 运行 此 aggregation pipeline 只需将文档与 en 键合并即可,即
{ $replaceRoot: {
newRoot: {
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
'$en'
]
}
} }
我的数据库
{
"_id": {
"$oid": "ddfsfs"
},
"id": 3,
"parent_id": 6,
"translation":
[
{
"language": "en",
"desc": "prod detail",
"name": "example1"
},
{
"language": "tr",
"desc": "detaylar",
"name": "ornek1"
}
]
}
我想做这个: 例如,只选择英文字段。如果它的最终形式只有英文字段中的名称和描述可以吗?以及如何?
{
"_id": {
"$oid": "ddfsfs"
},
"id": 3,
"parent_id": 6,
"desc": "prod detail",
"name": "example1"
}
或者数据库可以这样。再次只保留英文字段
{
"_id": {
"$oid": "62189ffd81f6b6bb05d8d409"
},
"id": 7,
"parent_id": 8,
"en": {
"desc": "hii",
"name": "serial ethernet"
},
"tr": {
"desc": "merhaba",
"name": "seri ethernet"
}
}
请分享我 mongodb 用于 nestjs 的聚合代码。谢谢!:)
对于第一个数据库模式,您需要一个管道,该管道将首先使用 $filter
运算符过滤 translation
数组。这将 return 一个仅包含满足过滤条件的文档的数组。所以表达式:
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} }
产生结果
[
{
"language" : "en",
"desc" : "prod detail",
"name" : "example1
}
]
第二步是将上述文档与您需要的 top-level 字段合并,在这种情况下,您希望 _id、id 和 parent_id 字段与上面的合并。为此使用 $mergeObjects
。
由于$mergeObjects
需要文档作为输入,您需要使用$arrayElemAt
或$first
运算符从数组中获取文档前一个 $filter
表达式,即
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
{ $first: {
$filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
}
} }
将return
{
"language" : "en",
"desc" : "prod detail",
"name" : "example1
}
现在您可以使用表达式
{
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
]
}
获得
{
"_id" : ObjectId("6218abb521d9a0dfecd02e4b"),
"parent_id" : 6.0,
"language" : "en",
"desc" : "prod detail",
"name" : "example1"
}
最后一步是将根替换为运算符 $replaceRoot
and your final aggregate pipeline Try the following aggregate pipeline (MongoDb Playground) 应该如下所示
{ $replaceRoot: {
newRoot: {
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
{ $arrayElemAt: [
{ $filter: {
input: '$translation',
cond: { '$eq': ['$$this.language', 'en'] }
} },
0
] }
]
}
} }
对于替代模式 运行 此 aggregation pipeline 只需将文档与 en 键合并即可,即
{ $replaceRoot: {
newRoot: {
$mergeObjects: [
{ _id: "$_id", id: '$id', parent_id: "$parent_id" },
'$en'
]
}
} }