sql >> データベース >  >> NoSQL >> MongoDB

mongodbは、ドキュメントをあるコレクションから別のコレクションに移動します

    @ markus-w-mahlbergが示した(そして@ mark-mullinが洗練された)一括操作は効率的ですが、書かれているように安全ではありません。 BulkInsertが失敗した場合でも、bulkRemoveは続行されます。移動時にレコードが失われないようにするには、代わりにこれを使用してください:

    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. mgoを使用したMongoDBでの効率的なページング

    2. MongoDB $ split

    3. mongoDB(mongoose)の仮想フィールドによる並べ替え

    4. セロリはタスクごとに新しい接続を作成します