2017-03-03 50 views
0

我堅持將數據保存在mongoDb中。這裏的數據是在數組中,如果mongodb沒有,我需要插入數據。請看代碼: -如何使用貓鼬在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 }) 

    }) 

根據上面的代碼,它必須插入六個文件而不是一個。我認爲上面的迭代不會等待完成前一個。所以,if條件始終是falseelse被執行。

回答

2

您的saveContact()功能沒問題。你得到6個文檔而不是1個文檔的原因是async.map()並行運行你的代碼。所有6個請求都是並行的,而不是一個接一個地進行。

async.map()功能的文檔 -

。注意,因爲該功能適用​​的iteratee並行的每個項目,也不能保證iteratee功能將在順序完成。

因此,在數據庫中創建文檔之前,所有查詢都已經運行,並且所有6個查詢都不能找到該文檔,因爲它仍處於創建過程中。因此,您的saveContact()方法會創建所有6個文檔。

如果您再次運行您的代碼,則不會形成更多文檔,因爲到那時您的文檔將會形成。

您應該嘗試使用async.mapSeries()來運行您的代碼以串行處理您的請求。只需在上面的代碼中將map()替換爲mapSeries()即可。這樣它就會等待一個請求完成,然後執行另一個請求,結果只會創建一個文檔。更多關於async.mapSeries()here

+0

沒有任何'async.serial()'方法。有'async.series()'方法,但我無法理解如何在上面的問題中使用循環運行此方法,即contactPersonData。 – user7104874

+0

@ user7104874請檢查我編輯的答案。 –

1

您似乎在使用async.map()錯誤。

首先,async.map()只有3個參數(即colliterateecallback),所以爲什麼你有4個?在你的情況下,coll是你的contactPersonData,iteratee是你的saveContact函數,而callback是一個匿名函數。

二,整點使用async.map()是爲了創建一個新的數組。您不是這樣使用它,而是更像是使用它async.each()

第三,您可能應循環遍歷元素,而不是並行。因此,您應該使用async.mapSeries()而不是async.map()

這是我會怎麼修改/縮短代碼:

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