2017-05-04 13 views
1

私はMongoDBのネイティブドライバを使用して私のmongodbデータベースを照会するexpressを使用しています。(Mongooseではなく)expressでDBコールの後に配列をフラット化する方法は?

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" 
        } 
      } 
    ] 

collection.find({'make.name': req.params.make}, {'model.name': 1, 'submodel.body': 1, '_id': 0}).toArray();

私はMongoDBのからの応答があります。これは完全にするために私が使用している現在のクエリがあり、MongoDBのの集計クエリまたはそれのいくつかのバリエーションで達成することができれば、私は気にしませんこれは私がこれまで簡素化したいと思います:

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

答えて

1

あなたはアグリゲーションパイプラインの下に試すことができます。 $addToSetは、それぞれのグループにおいて別個の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 
    } 
}) 
+0

あなたが投稿したものを試してみました。 $プロジェクトについてのちょっとした質問ですが、それを構築するのに手伝ってもらえますか?私の編集の出力を確認してください。私はちょうど "_id"を "モデル"に変更して、それ自身のオブジェクトのサブモデルをラップしたいと思います。 – Moshe

+0

ソートはどこで適用できますか?私はそれをmodel.nameでソートしたいと思います。 – Moshe

+1

私は '$ sort'を追加し、' $ project'を更新して期待される出力に合わせました。 – Veeram

関連する問題