嵌入式文档上的Mongodb $过滤器,返回所有集合数据?

时间:2018-04-23 08:51:08

标签: mongodb mongodb-query aggregation-framework

我正在使用mongodb,我有一个文件,它返回一个像这样的json:

{
            "_id": "5ad9a24be78f9d33888d2567",
            "tag": [],
            "active": 1,
            "code": "_CAROT",
            "name": [
                {
                    "lang": "uk",
                    "translation": "carot"
                },
                {
                    "lang": "fr",
                    "translation": "carotte"
                }
            ],
            "season": [],
            "category": [],
            "createdAt": "2018-04-23T07:59:51.261Z",
            "updatedAt": "2018-04-23T07:59:51.261Z",
            "__v": 0

}

我想在lang上添加一个过滤器,只获得一个翻译。所以我使用聚合和$ filter来做到这一点。这就是我的工作:

db.products.aggregate(
[ {$match: {'name.lang': "fr"}}, 
{$project: { name: {$filter: {
            input: '$name', 
            as: 'item', 
            cond: {$eq: ['$$item.lang', "fr"]} 
           }} 
       }} 
  ])

我得到了:

{ "_id" : ObjectId("5ad9a24be78f9d33888d2567"), "name" : [ { "lang" : "fr", "translation" : "carotte" } ] }
{ "_id" : ObjectId("5add96fedf3aac3d049196ca"), "name" : [ { "lang" : "fr", "translation" : "tomate" } ] }

但是我希望得到以下结果:

 {
                "_id": "5ad9a24be78f9d33888d2567",
                "tag": [],
                "active": 1,
                "code": "_CAROT",
                "name": [
                    {
                        "lang": "fr",
                        "translation": "carotte"
                    }
                ],
                "season": [],
                "category": [],
                "createdAt": "2018-04-23T07:59:51.261Z",
                "updatedAt": "2018-04-23T07:59:51.261Z",
                "__v": 0
}

基本上只有" fr"的默认结果结果在"名称"字段。

有没有办法使用mongoBD?

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以通过翻译使用聚合$unwind来“展开”。我的意思是,对于每个文档的每个翻译值,它将创建仅具有此翻译值的新文档(在同一级别,而不是在子文档中)。然后,您必须使用$match进行过滤才能保留“fr”翻译。

注意您必须复制每个字段名称才能将其包含在最终结果中。