sql >> Database >  >> NoSQL >> MongoDB

Mongo converteert ingesloten document naar array

Je moet nog steeds de inhoud herhalen, maar in plaats daarvan zou je terug moeten schrijven met bulkbewerkingen:

Ofwel voor MongoDB 2.6 en hoger:

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();

Of in moderne releases van MongoDB 3.2 en hoger, de bulkWrite() methode heeft de voorkeur:

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 });

Dus als u over een cursor terugschrijft naar de database, dan zijn bulkschrijfbewerkingen met een "ongeordende" set de juiste keuze. Het is slechts één schrijf/antwoord per batch van 1000 verzoeken, wat veel overhead vermindert, en "ongeordend" betekent dat schrijfacties parallel kunnen plaatsvinden in plaats van in een seriële volgorde. Het maakt het allemaal sneller.



  1. phpRedis-migratie naar cluster en consistente hashing

  2. Ingegeven argument moet een reeks van 24 hexadecimale tekens zijn - ik denk van wel

  3. MongoDB $objectToArray

  4. redis time-out voor verbinding met externe server in een docker