sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb flytta dokument från en samling till en annan samling

Bulkoperationerna @markus-w-mahlberg visade (och @mark-mullin raffinerade) är effektiva men osäkra som skrivet. Om bulkInsert misslyckas kommer bulkRemove fortfarande att fortsätta. För att vara säker på att du inte tappar några poster när du flyttar, använd detta istället:

function insertBatch(collection, documents) {
  var bulkInsert = collection.initializeUnorderedBulkOp();
  var insertedIds = [];
  var id;
  documents.forEach(function(doc) {
    id = doc._id;
    // Insert without raising an error for duplicates
    bulkInsert.find({_id: id}).upsert().replaceOne(doc);
    insertedIds.push(id);
  });
  bulkInsert.execute();
  return insertedIds;
}

function deleteBatch(collection, documents) {
  var bulkRemove = collection.initializeUnorderedBulkOp();
  documents.forEach(function(doc) {
    bulkRemove.find({_id: doc._id}).removeOne();
  });
  bulkRemove.execute();
}

function moveDocuments(sourceCollection, targetCollection, filter, batchSize) {
  print("Moving " + sourceCollection.find(filter).count() + " documents from " + sourceCollection + " to " + targetCollection);
  var count;
  while ((count = sourceCollection.find(filter).count()) > 0) {
    print(count + " documents remaining");
    sourceDocs = sourceCollection.find(filter).limit(batchSize);
    idsOfCopiedDocs = insertBatch(targetCollection, sourceDocs);

    targetDocs = targetCollection.find({_id: {$in: idsOfCopiedDocs}});
    deleteBatch(sourceCollection, targetDocs);
  }
  print("Done!")
}


  1. MongoDB som kötjänst?

  2. MongoDB :Aggregationsramverk :Få senast daterade dokument per grupperings-ID

  3. 5 sätt att välja rader med minimivärdet för sin grupp i SQL

  4. Hur man får schema av mongoose databas som definieras i en annan modell