MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Projeter un tableau d'objets sur la valeur clé

Oui, en utilisant $arrayToObject et $map pour convertir le tableau existant dans un format qu'il accepte :

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$concatArrays": [
          [{ "k": "date", "v": "$_id.date" }],  
          { "$map": {
            "input": "$aggr",
            "in": { "k": "$$this.gender", "v": "$$this.count" }
          }}
        ]
      }
    }    
  }}
])

Bien sûr, si ce n'est en fait que sur la "queue" d'une agrégation existante et que vous n'avez pas au moins MongoDB 3.4.4 où l'opérateur est introduit, alors vous pouvez simplement remodeler le résultat dans le code client :

db.collection.aggregate([
  // existing pipeline
]).map(d => 
  Object.assign(
    { date: d._id.date },
    d.aggr.reduce((acc,curr) =>
      Object.assign(acc,{ [curr.gender]: curr.count }),{}
    )
  )
)