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

Mongodb konvertiert mehrere Objekte dauerhaft in ein Array

Sie können die folgende Aggregationspipeline in 3.4 ausprobieren Version.

Die folgende Aggregation ändert die stores eingebettetes Dokument in ein Array von Schlüsselwertpaaren mit $objectToArray gefolgt von $map um ein transformiertes Array von mit einem neuen Feld auszugeben, während alle vorhandenen Felder beibehalten werden.

Massenaktualisierung zum Schreiben der neuen Speicherstruktur.

var bulk = db.getCollection(col).initializeUnorderedBulkOp();
var count = 0;
var batch = 1;

db.getCollection(col).aggregate([
{"$match":{"store_affiliation.stores":{"$ne":{"$type":4}}}},
{"$addFields":{
  "stores":{
      "$map":{
        "input":{"$objectToArray": "$store_affiliation.stores"}, 
        "in":{
           "store_code":"$$this.k", 
           "role":"$$this.v.role", 
           "startdate":"$$this.v.startdate", 
           "enddate":"$$this.v.enddate", 
           "permissions":"$$this.v.permissions"
         }
      }
    }
}}]).forEach(function(doc){ 
    var _id = doc._id; 
    var stores = doc.stores; 
    bulk.find({ "_id" : _id }).updateOne(
      { $set: {"store_affiliation.stores" : stores} }
   ); 
    count++;  
    if (count == batch) { 
        bulk.execute(); 
        bulk = db.getCollection(col).initializeUnorderedBulkOp(); 
        count = 0;
    } 
});

if (count > 0) { 
    bulk.execute(); 
}