MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Formatieren Sie die Sammlung mithilfe der Aggregationspipeline in Mongodb neu

Wenn die Position von Elementen in den metadata Feld und die Schlüssel von eingebetteten Dokumenten bekannt sind und Sie dann die Aggregation verwenden können.

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

Ergebnis:

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

Wenn eine der beiden oben genannten Voraussetzungen nicht bekannt ist, können Sie 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"}
})

Ergebnis:

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

Beachten Sie, dass der Schlüssel in value geändert wurde statt Metadaten. Dies kann leicht mit einem $project behoben werden in aggregation auf foobar Sammlung.