2017-03-03 5 views
0

mongoDbにデータを保存しようとしました。ここでデータは配列であり、mongodbが持っていなければデータを挿入する必要があります。コードを見てください - それは代わりに1の6つの文書を挿入する必要がありますmongooseを使ってnodejsに配列データを保存する方法は?

var contactPersonData = [{ 
    Name: 'Mr. Bah', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'Mr. Sel', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'Mr.ATEL', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'ANISH', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'sunny ji', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'ashish', 
    Organization: 'Ashima Limited - Point 2' 
}] 
console.log('filedata', contactPersonData); 
var escapeData = []; 
var tempArr = []; 

function saveContact(personObj, mainCallback) { 
    var tempC = personObj['Organization'].trim(); 
    var insertData = {}; 
    Contact.findOne({ companyName: tempC }) 
     .exec(function(err, contact) { 
      if (err) 
       return mainCallback(err); 
      console.log('find com', contact) 
      if (contact) { 
       //document exists 
       mainCallback(null, insertData); 
      } else { 
       var newContact = new Contact({ companyName: tempC, createdBy: '58ae5d18ba71d4056f30f7b1' }); 
       newContact.save(function(err, contact) { 
        if (err) 
         return mainCallback(err); 
        console.log('new contact', contact) 
        insertData.contactId = contact._id; 
        insertData.name = personObj['Name']; 
        insertData.email = personObj['Email']; 
        insertData.contactNumber = { number: personObj['Phone'] }; 
        insertData.designation = personObj['Designation']; 
        tempArr.push(insertData); 
        mainCallback(null, insertData); 
       }) 
      } 

     }); 
} 
async.map(contactPersonData, saveContact, function(err, result) { 
     console.log(err) 
     console.log(result) 
    }, 
    function(err) { 
     if (err) 
      return next(err); 
     res.status(200).json({ unsaved: escapeData }) 

    }) 

上記のコードを1として。私は、上記の繰り返しは前のものを完了するのを待たないと思う。したがって、ifの条件は常にfalseとなり、elseが実行されます。

答えて

2

saveContact()機能は正常です。 1つの文書の代わりに6つの文書を取得する理由は、async.map()が並列にコードを実行するためです。 6つの要求はすべて並列に行われ、順番に並行して行われるわけではありません。

注、この機能が並行して各項目にiterateeを適用するので、iteratee機能が順番に完了するという保証がないこと - async.map()機能のドキュメントから

結果として、ドキュメントがデータベースに作成される前に、すべてのクエリが既に実行されており、6つのクエリのすべてがそのドキュメントをまだ作成中のプロセスから見つけられません。したがって、saveContact()メソッドは6つの文書すべてを作成します。

コードをもう一度実行すると、その時点でドキュメントが形成されるため、これ以上ドキュメントが作成されません。

async.mapSeries()を使用してコードを実行して、リクエストをシリアルで処理する必要があります。上記のコードでmap()mapSeries()に置き換えてください。このようにして、1つの要求が完了してから別の要求が実行されるまで待機し、結果として1つの文書のみが作成されます。 async.mapSeries()hereの詳細

+0

'async.serial()'メソッドはありません。 'async.series()'メソッドがありますが、このメソッドをループで実行する方法、つまり上記の質問の 'contactPersonData'を理解できませんでした。 – user7104874

+0

@ user7104874私の編集した答えを確認してください。 –

1

あなたはasync.map()が間違っているようです。

まず、async.map()はわずか3つのパラメータ(すなわちcolliteratee、およびcallback)を持っているので、なぜあなたは4を持っているのですか?あなたのケースでは、collcontactPersonDataiterateesaveContactファンクション、callbackは無名関数です。

第2に、async.map()の使用のポイントは、新しい配列を作成することです。あなたはその方法ではなく、代わりにasync.each()のように使っています。

第3に、要素を順番にループし、並列しないようにする必要があります。したがって、async.map()の代わりにasync.mapSeries()を使用する必要があります。ここで

は、私はあなたのコードを短くする/改訂ます方法は次のとおりです。??コメントの面では

var contactPersonData = [{ 
    Name: 'Mr. Bah', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'Mr. Sel', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'Mr.ATEL', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'ANISH', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'sunny ji', 
    Organization: 'Ashima Limited - Point 2' 
}, { 
    Name: 'ashish', 
    Organization: 'Ashima Limited - Point 2' 
}]; 

function saveContact(personObj, mainCallback) { 
    var tempC = personObj.Organization.trim(); 
    Contact.findOne({ companyName: tempC }, function (err, contact) { 
     if (err) 
      return mainCallback(err); 
     console.log('found contact', contact); 
     // document exists, so mark it as complete and pass the old item 
     if (contact) 
      return mainCallback(null, contact); 
     // document does not exist, so add it 
     contact = new Contact({ companyName: tempC, createdBy: '58ae5d18ba71d4056f30f7b1' }); 
     contact.save(function (err, contact) { 
      if (err) 
       return mainCallback(err); 
      console.log('created new contact', contact) 
      // mark it as complete and pass a new/transformed item 
      mainCallback(null, { 
       contactId: contact._id, 
       name: personObj.Name, 
       email: personObj.Email, // ?? 
       contactNumber: { number: personObj.Phone }, // ?? 
       designation: personObj.Designation // ?? 
      }); 
     }); 
    }); 
}; 

async.mapSeries(contactPersonData, saveContact, function (err, contacts) { 
    if (err) 
     return next(err); 
    // at this point, contacts will have an array of your old and new/transformed items 
    console.log('transformed contacts', contacts); 
    res.json({ unsaved: contacts }); 
}); 

、それはあなたがあなたのcontactPersonDataでこれらの性質を持っていないので、undefinedだろうことを意味します。

関連する問題