如何使用猫鼬在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
条件始终是false
和else
被执行。
您的saveContact()
功能没问题。你得到6个文档而不是1个文档的原因是async.map()
并行运行你的代码。所有6个请求都是并行的,而不是一个接一个地进行。
从async.map()
功能的文档 -
。注意,因为该功能适用的iteratee并行的每个项目,也不能保证iteratee功能将在顺序完成。
因此,在数据库中创建文档之前,所有查询都已经运行,并且所有6个查询都不能找到该文档,因为它仍处于创建过程中。因此,您的saveContact()
方法会创建所有6个文档。
如果您再次运行您的代码,则不会形成更多文档,因为到那时您的文档将会形成。
您应该尝试使用async.mapSeries()
来运行您的代码以串行处理您的请求。只需在上面的代码中将map()
替换为mapSeries()
即可。这样它就会等待一个请求完成,然后执行另一个请求,结果只会创建一个文档。更多关于async.mapSeries()
here。
您似乎在使用async.map()
错误。
首先,async.map()只有3个参数(即coll
,iteratee
和callback
),所以为什么你有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
。
没有任何'async.serial()'方法。有'async.series()'方法,但我无法理解如何在上面的问题中使用循环运行此方法,即contactPersonData。 – user7104874
@ user7104874请检查我编辑的答案。 –