首页 > 解决方案 > 如果存在,则根据值对 mongo 集合进行分组,否则不分组,按原样显示

问题描述

我想按“公司”属性对以下集合进行分组,仅当公司属性可用时,不要按原样分组显示

这是我的收藏。

{
    "_id":"Wagon R",
    "type": "Car",
    "Company": "Suzuki"
},
{
    "_id":"Ertiga",
    "type": "Car",
    "Company": "Suzuki"
},
{
    "_id":"Accent",
    "type": "Car",
    "Company": "Hyundai"
},
{
    "_id":"Camry",
    "type": "Car",
    "Company": "Toyoto"
},
{
    "_id":"Corollo",
    "type": "Car",
    "Company": "Toyoto"
},
{
    "_id":"M 800",
    "type": "Car",
    "Company": ""
},
{
    "_id":"E 800",
    "type": "Car",
},
{
    "_id":"X 800",
    "type": "Car",
}

所需的样本输出。

{
    "_id":"Wagon R",
},
{
    "_id":"Accent",
},
{
    "_id":"Camry",
},
{
    "_id":"M 800",
},
{
    "_id":"E 800",
},
{
    "_id":"X 800",
}

我尝试了分组,但它给出了只有公司属性的集合。我也想要没有公司属性的记录有人可以帮忙吗

    {
        "$match" : ----
    },

    {
      "$group": {
        "_id": "$Company",
        "doc": {"$first":"$$ROOT"}


      }
    },
    {
        "$replaceRoot": {"newRoot":"$doc"}
    }

标签: mongodbgrouping

解决方案


我在这个查询的帮助下得到了它:

db.getCollection('test999').aggregate([
    {
        $addFields: {
            groupCompany: 
            { 
                $switch: {
                    branches: [
                        { case : { $lt : ["$Company", null]}, then : "$_id"},
                        { case : { $ne : ["$Company", ""]}, then: "$Company"},
                        { case : { $eq : ["$Company",""]}, then : "$_id"} 
                    ]
                    ,default: "default"
                }
            }
        }
    },
    {
        "$group": {
            "_id": "$groupCompany",
            "doc": { "$first": "$$ROOT" }
        }
    },
    {
        "$replaceRoot": { "newRoot": "$doc" }
    }
]);

推荐阅读