如何在数据库调用后明确数组?

我正在使用快速查询使用本机驱动程序(而不是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”现在是一个独特的身体types的数组。

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

当前查询:

 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) }) 

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

 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 } })