我的数据库

{
    "_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"
    }
}

请分享我在nestjs中使用的mongodb聚合代码.谢谢!:)

推荐答案

对于第一个数据库模式,需要一个管道,首先使用$filter运算符过滤translationarray.这将返回一个数组,其中只包含满足筛选条件的文档.所以这个表达:

{ $filter: {
    input: '$translation',
    cond: { '$eq': ['$$this.language', 'en'] }
} }

产生结果

[
    {
        "language" : "en",
        "desc" : "prod detail",
        "name" : "example1
    }
]

第二步是将上述文档与所需的顶级字段合并,在本例中,您希望_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'] }
    } 
} } 

会回来的

{
    "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替换根,最后的聚合管道try 下面的聚合管道(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'
        ] 
    } 
} } 

Mongodb相关问答推荐

MongoDB—基于数组中同一文档中的另一个字段更新字段

数组相等条件返回的文档多于与相等匹配的文档:MongoDB

在MongoDB中获取所有帖子时如何获取相关用户信息

在延迟函数中重用 context.WithTimeout

如何将以下聚合查询转换为 bson 并在 golang 中执行

mongoose中的 required是什么意思?

mongo.lock 文件有什么用?

从 PHP 打印 MongoDB 日期

Mongoose $push 不断添加两个条目

你如何让 mongo 在远程服务器上运行?

ZonedDateTime 与 MongoDB

MongoDB:在集合上设置 TTL 索引时出错: sessions

C# mongodb driver 2.0 - 如何在批量操作中更新插入?

了解 Mongoose 中的关系和外键

如何在java中删除mongodb集合中的所有文档

更新时提示Field name duplication not allowed with modifiers

pre save和validate之间的mongoose区别?什么时候用哪一个?

单个语句中的多个 mongo 更新运算符?

MongoDB:聚合框架: $match between fields

在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么