sql >> Database >  >> NoSQL >> MongoDB

Formatteer verzameling opnieuw met behulp van aggregatiepijplijn in Mongodb

Als de positie van elementen in de metadata veld en de sleutels van ingesloten documenten is bekend en dan kun je aggregatie gebruiken.

db.foo.aggregate([
  {
    $project : {
      data : {
        "Language" : {
          $arrayElemAt : ["$metadata", 0]
        },
        "City" : {
          $arrayElemAt : ["$metadata", 1]
        },
        "Gender" : {
          $arrayElemAt : ["$metadata", 2]
        }
      }
    }
  },
  {
    $project : {
      metadata : {
        Language : "$data.Language.value",
        City : "$data.City.value",
        Gender : "$data.Gender.value"
      }
    }
  }
])

Resultaat:

{ "_id" : "213412323234", "metadata" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }

Als een van de twee bovengenoemde randvoorwaarden niet bekend is, kunt u mapReduce .

db.foo.mapReduce(function () {
  var key = this._id;
  var metadata = this.metadata;
  var valueEmit = {};
  for (var i = 0; i < metadata.length; i++) {
    valueEmit[metadata[i].id] = metadata[i].value;
  }
  emit(key, valueEmit)
},
function(key, values) {
  // do nothing as it won't be called 
  // for if value is only one 
  // for a key
},
{
  out : {replace : "foobar"}
})

Resultaat:

> db.foobar.find()
{ "_id" : "213412323234", "value" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }

Merk op dat de sleutel is gewijzigd in value in plaats van metagegevens. Dit kan eenvoudig worden opgelost met een $project in aggregation op foobar collectie.



  1. Uitgeschakelde bewerking mislukt voor MongoMapper-model, kan sleutel niet verwijderen/verwijderen van model

  2. Update geneste subdocumenten in MongoDB met arrayFilters

  3. mgo:hoe een specifieke array in een document bij te werken

  4. MongoDB:probleem bij gebruik van mongoexport met --query-optie