【问题标题】:How to flatten an array after db call in express?如何在快递中调用数据库后展平数组?
【发布时间】:2017-10-03 05:18:53
【问题描述】:

我正在使用 express 使用本机驱动程序(不是 Mongoose)查询我的 mongodb 数据库。

我正在尝试在 MongoDB 响应后清理一些数据。我不介意这是否可以通过 MongoDB 的聚合查询或其一些变体来实现,为了完整起见,我正在使用的当前查询是:collection.find({'make.name': req.params.make}, {'model.name': 1, 'submodel.body': 1, '_id': 0}).toArray();

我收到了来自 mongodb 的回复:

[
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "3 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Convertible"
                    }
            },
            {
                    "model" : {
                            "name" : "2 Series"
                    },
                    "submodel" : {
                            "body" : "Coupe"
                    }
            }
    ]

我想简化为:

[
 "model" : {
   "name": "2 Series"
  }

 "submodel" : {
   "body": ["Convertible", "Coupe"]
  }

 "model" : {
   "name": "3 Series"
  }

 "submodel" : {
   "body": ["Convertible", "Coupe"]
  }
]

新输出:

{ "_id" : "M3", "submodel" : [ "Sedan" ] }
{ "_id" : "X5 eDrive", "submodel" : [ "SUV" ] }
{ "_id" : "X5 M", "submodel" : [ "SUV" ] }
{ "_id" : "M4 GTS", "submodel" : [ "Coupe" ] }
{ "_id" : "ActiveHybrid 5", "submodel" : [ "Sedan" ] }
{ "_id" : "X5", "submodel" : [ "SUV" ] }
{ "_id" : "X6 M", "submodel" : [ "SUV" ] }
{ "_id" : "i8", "submodel" : [ "Coupe" ] }
{ "_id" : "X4", "submodel" : [ "SUV" ] }
{ "_id" : "5 Series Gran Turismo", "submodel" : [ "Hatchback" ] }
{ "_id" : "M4", "submodel" : [ "Coupe", "Convertible" ] }
{ "_id" : "5 Series", "submodel" : [ "Sedan" ] }
{ "_id" : "M6 Gran Coupe", "submodel" : [ "Sedan" ] }
{ "_id" : "X1", "submodel" : [ "SUV" ] }
{ "_id" : "3 Series eDrive", "submodel" : [ "Sedan" ] }
{ "_id" : "2 Series", "submodel" : [ "Coupe", "Convertible" ] }
{ "_id" : "6 Series Gran Coupe", "submodel" : [ "Sedan" ] }
{ "_id" : "3 Series", "submodel" : [ "Wagon", "Sedan" ] }
{ "_id" : "Z4", "submodel" : [ "Convertible" ] }
{ "_id" : "6 Series", "submodel" : [ "Convertible", "Coupe" ] }

新输出:

{
"_id": "2 Series",
"submodel": [
"Coupe",
"Convertible"
]
},
{
"_id": "3 Series",
"submodel": [
"Wagon",
"Sedan"
]
},
{
"_id": "3 Series Gran Turismo",
"submodel": [
"Hatchback"
]
},
{
"_id": "3 Series eDrive",
"submodel": [
"Sedan"
]
},
{
"_id": "4 Series",
"submodel": [
"Coupe",
"Convertible"
]
},

如您所见,model.name 是一个独特的属性,而“submodel.body”现在是一组独特的身体类型。

如何将我的非唯一模型数组转换为唯一模型数组?

当前查询:

router.get('/test/:make', (req, res) => {
            var collection = db.get().collection('styles');
            collection.aggregate({
                $match: {
                    $or: [{
                            "make.niceName": req.params.make
                        },
                        {
                            "make.name": req.params.make
                        }
                    ]
                }
            }, {
                $group: {
                    _id: "$model.name",
                    "submodels": {
                        $addToSet: "$submodel.body"
                    }
                }
            }, {
                $sort: {
                    _id: 1
                }
            }, {
                $project: {
                    models: "$_id",
                    submodel: 1,
                    _id: 0
                }
            }).toArray((err, docs) => {
                res.send(docs)
            })

【问题讨论】:

    标签: arrays node.js mongodb express


    【解决方案1】:

    您可以尝试以下聚合管道。 $addToSet 在每个 model 组中获得不同的 submodel

    collection.aggregate({
        $match: {
            "make.name": req.params.make
        }
    }, {
        $group: {
            _id: "$model.name",
            submodel: {
                $addToSet: "$submodel.body"
            }
        }
    }, {
        $sort: {
            _id: 1
        }
    }, {
        $project: {
            models: "$_id",
            submodel: 1,
            _id: 0
        }
    })
    

    【讨论】:

    • 我添加了$sort asc 并更新了$project 以匹配预期的输出。
    • 请使用最新版本重试。它应该类似于{ "submodel" : [ "Coupe", "Convertible" ], "models" : "2 Series" }
    • 我可以看看你的查询吗?
    • 我不确定你为什么会看到 _id 。当我运行您的查询时,我得到{ "models" : "2 Series" }。顺便说一句,您的$group (submodels) 阶段与答案中的$group(submodel) 阶段不匹配。
    • 你能扩展你的评论吗?我不明白你所说的等效字段是什么意思
    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 2019-08-03
    • 2015-07-14
    • 2014-05-21
    • 2011-12-14
    • 2019-11-16
    • 2019-06-30
    • 1970-01-01
    相关资源
    最近更新 更多