如何使用猫鼬在nodejs中保存数组数据?

如何使用猫鼬在nodejs中保存数组数据?

问题描述:

我坚持将数据保存在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被执行。

您的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请检查我编辑的答案。 –

您似乎在使用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