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

mongodb flytte dokumenter fra en samling til en anden samling

Masseoperationerne @markus-w-mahlberg viste (og @mark-mullin raffineret) er effektive, men usikre som skrevet. Hvis bulkInsert mislykkes, vil bulkRemove stadig fortsætte. For at sikre dig, at du ikke mister nogen registreringer, når du flytter, skal du bruge denne i stedet:

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. Bestemmelse af den bedste arkitektur for en MongoDB-klyngeimplementering

  2. Kan selleri celerybeat bruge en Database Scheduler uden Django?

  3. Sådan analyseres og optimeres hukommelsesforbrug i Redis

  4. mongo 3 dubletter på unikt indeks - dropDups