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

{ $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'
        ] 
    } 
} }