복붙노트

[MONGODB] 어떻게 동시에 몽구스 / Node.js를 여러 문서를 저장할 수 있습니까?

MONGODB

어떻게 동시에 몽구스 / Node.js를 여러 문서를 저장할 수 있습니까?

순간 나는 하나의 문서를 추가하는 저장 사용합니다. 나는 하나의 객체로 저장하려는 것을 문서의 배열이 있다고 가정합시다. 그것은이 완료되면 하나의 콜백을 받고 다음 하나의 함수 호출로 그들 모두를 추가하고의 방법이 있습니까? 나는 개별적으로 모든 문서를 추가 할 수 있지만, 모든 것이 문제가 될 것 완료되면 콜백을 관리하는 것은 운동 할 수 있습니다.

해결법

  1. ==============================

    1.몽구스 (문제 # 723 참조) 아직 구현 대량 삽입이 없습니다.

    몽구스 (문제 # 723 참조) 아직 구현 대량 삽입이 없습니다.

    당신이 저장하고 문서의 수를 알고 있기 때문에, 다음과 같이 쓸 수있다 :

    var total = docArray.length
      , result = []
    ;
    
    function saveAll(){
      var doc = docArray.pop();
    
      doc.save(function(err, saved){
        if (err) throw err;//handle error
    
        result.push(saved[0]);
    
        if (--total) saveAll();
        else // all saved here
      })
    }
    
    saveAll();
    

    이것은 물론, 정지 갭 솔루션이며 나는 흐름 제어 라이브러리 (나는 Q를 사용하고 굉)의 일종을 사용하는 것이 좋습니다 것입니다.

  2. ==============================

    2.몽구스는 이제 Model.create에 여러 문서 구조를 통과지지 않습니다. 자신의 API의 예를 인용하면, 그것은 배열 또는이 끝에 콜백 객체의 목록을 변수 인수 하나를 전달되는 지원

    몽구스는 이제 Model.create에 여러 문서 구조를 통과지지 않습니다. 자신의 API의 예를 인용하면, 그것은 배열 또는이 끝에 콜백 객체의 목록을 변수 인수 하나를 전달되는 지원

    Candy.create({ type: 'jelly bean' }, { type: 'snickers' }, function (err, jellybean, snickers) {
        if (err) // ...
    });
    

    또는

    var array = [{ type: 'jelly bean' }, { type: 'snickers' }];
    Candy.create(array, function (err, jellybean, snickers) {
        if (err) // ...
    });
    

    편집 : 많은이 언급 한 바와 같이,이 진정한 대량 삽입을 수행하지 않습니다 - 단순히 여러 번 저장 자신을 호출의 복잡성을 숨 깁니다. 답변 및 성능의 관심에서 대량 삽입을 달성하기 위해 실제 몽고 드라이버를 사용하는 방법을 설명하는 아래의 댓글이 있습니다.

  3. ==============================

    3.몽구스 4.4 insertMany라는 방법을 추가

    몽구스 4.4 insertMany라는 방법을 추가

    문제점 # 723에서 vkarpov15을 인용 :

    이 방법의 서명을 만들 동일합니다 :

    Model.insertMany([ ... ], (err, docs) => {
      ...
    })
    

    또는 약속과 :

    Model.insertMany([ ... ]).then((docs) => {
      ...
    }).catch((err) => {
      ...
    })
    
  4. ==============================

    4.몽구스의 대량 삽입은 액세스 미들웨어에 필요가없는 경우를 취소하려면 ()을 수행 할 수 있습니다.

    몽구스의 대량 삽입은 액세스 미들웨어에 필요가없는 경우를 취소하려면 ()을 수행 할 수 있습니다.

    Model.collection.insert (문서, 옵션, 콜백)

    https://github.com/christkv/node-mongodb-native/blob/master/lib/mongodb/collection.js#L71-91

  5. ==============================

    5.병렬 코드 비동기 사용은 다음과 같이 표시됩니다

    병렬 코드 비동기 사용은 다음과 같이 표시됩니다

      async.parallel([obj1.save, obj2.save, obj3.save], callback);
    

    이 협약이 비동기 같이 몽구스에서 동일하기 때문에 (ERR, 콜백) 그냥 배열에 호출을 저장을 추가하고 모두 완료 할 때 콜백을 얻을 것이다, 당신의 자신의 콜백에서 그 (것)들을 포장 할 필요가 없습니다.

    당신이 mapLimit를 사용하는 경우 당신은 당신이 병렬로 저장하는 방법을 많은 문서를 제어 할 수 있습니다. 모든 항목이 성공적으로 저장 될 때까지이 예에서 우리는 • 병렬 10 문서를 저장합니다.

    async.mapLimit(myArray, 10, function(document, next){
      document.save(next);
    }, done);
    
  6. ==============================

    6.나는이 오래된 질문 알아요,하지만 정답은 여기에 더 적절가없는 저를 걱정. 대부분의 대답은 당신이 몇 가지 더 문서보다이있는 경우 나쁜 아이디어이다, 개별적으로 각각의 모든 문서를 통해 반복 및 저장에 대해 이야기하고, 과정도 하나의 많은 요청에 대해 반복됩니다.

    나는이 오래된 질문 알아요,하지만 정답은 여기에 더 적절가없는 저를 걱정. 대부분의 대답은 당신이 몇 가지 더 문서보다이있는 경우 나쁜 아이디어이다, 개별적으로 각각의 모든 문서를 통해 반복 및 저장에 대해 이야기하고, 과정도 하나의 많은 요청에 대해 반복됩니다.

    MongoDB를 구체적으로 여러 문서에 삽입하기위한 batchInsert () 호출을 가지며, 이것은 원래 MongoDB의 드라이버에서 사용되어야한다. 몽구스는이 드라이버를 기반으로, 그것은 일괄 삽입을 지원하지 않습니다. 이 MongoDB를위한 오브젝트 문서 모델링 도구 있어야하는데 그것은 아마 의미가 있습니다.

    해결 방법 : 몽구스는 기본 MongoDB의 드라이버와 함께 제공됩니다. 당신은 그것을 필요로 요구하여 해당 드라이버를 사용할 수 있습니다 ( '몽구스 / node_modules / MongoDB를') (너무 확실 이것에 대해,하지만 당신은 항상 일을하지 않는 다시 경우 MongoDB를의 NPM을 설치할 수 있습니다,하지만 난 그것을해야한다고 생각) 다음 할 적절한 batchInsert

  7. ==============================

    7.MongoDB를 지원 대량 작업의 최신 버전 :

    MongoDB를 지원 대량 작업의 최신 버전 :

    var col = db.collection('people');
    var batch = col.initializeUnorderedBulkOp();
    
    batch.insert({name: "John"});
    batch.insert({name: "Jane"});
    batch.insert({name: "Jason"});
    batch.insert({name: "Joanne"});
    
    batch.execute(function(err, result) {
        if (err) console.error(err);
        console.log('Inserted ' + result.nInserted + ' row(s).');
    }
    
  8. ==============================

    8.여기에 또 다른 방법은 추가 라이브러리를 사용하지 않고있다 (오류 검사는 포함되지 않습니다)

    여기에 또 다른 방법은 추가 라이브러리를 사용하지 않고있다 (오류 검사는 포함되지 않습니다)

    function saveAll( callback ){
      var count = 0;
      docs.forEach(function(doc){
          doc.save(function(err){
              count++;
              if( count == docs.length ){
                 callback();
              }
          });
      });
    }
    
  9. ==============================

    9.당신은 모든이없는 몽구스의 약속, 저장 몽구스에 의해 반환 약속을 사용할 수 있지만,이 모듈로 기능을 추가 할 수 있습니다.

    당신은 모든이없는 몽구스의 약속, 저장 몽구스에 의해 반환 약속을 사용할 수 있지만,이 모듈로 기능을 추가 할 수 있습니다.

    모두와 몽구스의 약속을 향상 모듈을 만듭니다.

    var Promise = require("mongoose").Promise;
    
    Promise.all = function(promises) {
      var mainPromise = new Promise();
      if (promises.length == 0) {
        mainPromise.resolve(null, promises);
      }
    
      var pending = 0;
      promises.forEach(function(p, i) {
        pending++;
        p.then(function(val) {
          promises[i] = val;
          if (--pending === 0) {
            mainPromise.resolve(null, promises);
          }
        }, function(err) {
          mainPromise.reject(err);
        });
      });
    
      return mainPromise;
    }
    
    module.exports = Promise;
    

    그리고 몽구스와 함께 사용 :

    var Promise = require('./promise')
    
    ...
    
    var tasks = [];
    
    for (var i=0; i < docs.length; i++) {
      tasks.push(docs[i].save());
    }
    
    Promise.all(tasks)
      .then(function(results) {
        console.log(results);
      }, function (err) {
        console.log(err);
      })
    
  10. ==============================

    10.사용 insertMany 많은 문서를 삽입하는 기능을 수행합니다. 이 서버에 하나의 작업을 보내고 몽구스는 몽고 서버를 타격하기 전에 모든 문서의 유효성을 검사합니다. 순서대로 기본 몽구스 삽입 항목으로 그들은 배열에 존재한다. 당신이 다음 설정 순서를 유지하지로 확인하는 경우 주문 : 거짓을.

    사용 insertMany 많은 문서를 삽입하는 기능을 수행합니다. 이 서버에 하나의 작업을 보내고 몽구스는 몽고 서버를 타격하기 전에 모든 문서의 유효성을 검사합니다. 순서대로 기본 몽구스 삽입 항목으로 그들은 배열에 존재한다. 당신이 다음 설정 순서를 유지하지로 확인하는 경우 주문 : 거짓을.

    중요 - 오류 처리 :

    주문시 하나는 모든 것이 실패 실패 할 경우 사실 확인 및 오류 처리는 그룹 수단에 발생합니다.

    거짓 검증 및 오류 처리가 개별적으로 발생하고 작업이 계속됩니다 때 명령했다. 오류는 오류의 배열에 다시보고됩니다.

  11. ==============================

    11.라는 파일 mongoHelper.js 추가

    라는 파일 mongoHelper.js 추가

    var MongoClient = require('mongodb').MongoClient;
    
    MongoClient.saveAny = function(data, collection, callback)
    {
        if(data instanceof Array)
        {
            saveRecords(data,collection, callback);
        }
        else
        {
            saveRecord(data,collection, callback);
        }
    }
    
    function saveRecord(data, collection, callback)
    {
        collection.save
        (
            data,
            {w:1},
            function(err, result)
            {
                if(err)
                    throw new Error(err);
                callback(result);
            }
        );
    }
    function saveRecords(data, collection, callback)
    {
        save
        (
            data, 
            collection,
            callback
        );
    }
    function save(data, collection, callback)
    {
        collection.save
        (
            data.pop(),
            {w:1},
            function(err, result)
            {
                if(err)
                {               
                    throw new Error(err);
                }
                if(data.length > 0)
                    save(data, collection, callback);
                else
                    callback(result);
            }
        );
    }
    
    module.exports = MongoClient;
    

    그런 다음 코드 변경에 당신은에 필요

    var MongoClient = require("./mongoHelper.js");
    

    그런 다음 통화를 저장하는 시간이있을 때 (당신이 연결 컬렉션을 검색 한 후)

    MongoClient.saveAny(data, collection, function(){db.close();});
    

    당신은 당신의 요구에 맞게 오류 처리를 변경 콜백 등의 오류를 다시 전달할 수 있습니다

  12. ==============================

    12.이것은 오래된 질문이지만, "문서의 몽구스 삽입 배열"을 검색 할 때 구글 결과에 나를 위해 먼저했다.

    이것은 오래된 질문이지만, "문서의 몽구스 삽입 배열"을 검색 할 때 구글 결과에 나를 위해 먼저했다.

    model.create () [몽구스] 및 model.collection.insert () [MongoDB를] 당신이 사용할 수있는 두 가지 옵션이 있습니다. 여기에 각 옵션의 장점 / 단점에 대해 더욱 철저한 토론을보기 :

    몽구스 (MongoDB를) 일괄 삽입?

  13. ==============================

    13.여기에서 직접 몽구스)의 MongoDB를 Model.collection.insert을 (사용하는 예이다. , 당신은 MongoDB를의 대량 작업 (이 참조)를 사용할 필요가 없습니다 당신이 그렇게 많은 서류가없는 경우, 100 개 미만의 문서를 말하는 것을 참고하시기 바랍니다.

    여기에서 직접 몽구스)의 MongoDB를 Model.collection.insert을 (사용하는 예이다. , 당신은 MongoDB를의 대량 작업 (이 참조)를 사용할 필요가 없습니다 당신이 그렇게 많은 서류가없는 경우, 100 개 미만의 문서를 말하는 것을 참고하시기 바랍니다.

    var mongoose = require('mongoose');
    
    var userSchema = mongoose.Schema({
      email : { type: String, index: { unique: true } },
      name  : String  
    }); 
    
    var User = mongoose.model('User', userSchema);
    
    
    function saveUsers(users) {
      User.collection.insert(users, function callback(error, insertedDocs) {
        // Here I use KrisKowal's Q (https://github.com/kriskowal/q) to return a promise, 
        // so that the caller of this function can act upon its success or failure
        if (!error)
          return Q.resolve(insertedDocs);
        else
          return Q.reject({ error: error });
      });
    }
    
    var users = [{email: 'foo@bar.com', name: 'foo'}, {email: 'baz@bar.com', name: 'baz'}];
    saveUsers(users).then(function() {
      // handle success case here
    })
    .fail(function(error) {
      // handle error case here
    });
    
  14. from https://stackoverflow.com/questions/10266512/how-can-i-save-multiple-documents-concurrently-in-mongoose-node-js by cc-by-sa and MIT license