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

Mongo konverter indlejret dokument til array

Du skal stadig gentage indholdet, men i stedet skal du skrive tilbage ved hjælp af masseoperationer:

Enten for MongoDB 2.6 og nyere:

var bulk = db.collection.initializeUnorderedBulkOp(),
    count = 0;

db.collection.find({ 
   "$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
    bulk.find({ "_id": doc._id }).updateOne({
        "$set": { "experience": [doc.experience["0"]] }
    });
    count++;

    // Write once in 1000 entries
    if ( count % 1000 == 0 ) {
        bulk.execute();    
        bulk = db.collection.initializeUnorderedBulkOp();
    }
})

// Write the remaining
if ( count % 1000 != 0 )
    bulk.execute();

Eller i moderne udgivelser af MongoDB 3.2 og nyere, bulkWrite() metode foretrækkes:

var ops = [];

db.collection.find({ 
   "$where": "return !Array.isArray(this.experience)"
}).forEach(function(doc) {
   ops.push({
       "updateOne": {
           "filter": { "_id": doc._id },
           "update": { "$set": { "experience": [doc.experience["0"]] } }
       }
   });

   if ( ops.length == 1000 ) {
       db.collection.bulkWrite(ops,{ "ordered": false })
       ops = [];
   }
})

if ( ops.length > 0 )
    db.collection.bulkWrite(ops,{ "ordered": false });

Så når du skriver tilbage til databasen over en markør, så er bulk-skriveoperationer med "uordnet" indstillet vejen at gå. Det er kun én skrive/svar pr. batch af 1000 anmodninger, hvilket reducerer en masse overhead, og "uordnet" betyder, at skrivning kan ske parallelt i stedet for i en seriel rækkefølge. Det hele gør det hurtigere.



  1. hvordan får man alle nøgler og værdier i redis i javascript?

  2. Hvordan får man Redis til at køre på Azure?

  3. Timeout-undtagelse efter async-kommandoer og Task.WhenAny venter i StackExchange.Redis

  4. Redis :Hvordan kan jeg sortere min hash efter nøgler?