Du kan prova nedanstående aggregeringspipeline i 3.4
version.
Nedanstående aggregering ändrar butikerna
inbäddat dokument i en array av nyckelvärdespar med $objectToArray
följt av $map
för att mata ut transformerad array av med nytt fält samtidigt som alla befintliga fält behålls.
Massuppdatering för att skriva den nya butiksstrukturen.
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();
}