sql >> Database teknologi >  >> NoSQL >> MongoDB

Omformater samling ved hjælp af aggregeringspipeline i Mongodb

Hvis placeringen af ​​elementer i metadata felt og nøglerne til indlejrede dokumenter er kendt, og så kan du bruge aggregering.

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

Resultat:

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

Hvis nogen af ​​ovenstående to forudsætninger nævnt ovenfor ikke er kendt, kan du bruge 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"}
})

Resultat:

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

Bemærk, at nøglen er blevet ændret til value i stedet for metadata. Dette kan nemt rettes ved hjælp af et $project i aggregationfoobar samling.



  1. Kan ikke oprette forbindelse til Mongo DB via Spark

  2. Eksporter et array i csv fra MongoDB

  3. Model.find().toArray() hævder ikke at have .toArray()-metoden

  4. case-ufølsom forespørgsel på mongodb