如何使用猫鼬在nodejs中保存数组数据?
How to save array data in nodejs using mongoose?
我被困在 mongoDb 中保存数据。这里的数据在数组中,如果 mongodb 没有,我需要插入数据。请看代码:-
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()
函数的文档 -
Note, that since this function applies the iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order.
因此,在您的数据库中创建文档之前,所有查询都已经 运行 并且所有 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()
。
我会这样 revise/shorten 你的代码:
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
.
我被困在 mongoDb 中保存数据。这里的数据在数组中,如果 mongodb 没有,我需要插入数据。请看代码:-
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()
函数的文档 -
Note, that since this function applies the iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order.
因此,在您的数据库中创建文档之前,所有查询都已经 运行 并且所有 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()
。
我会这样 revise/shorten 你的代码:
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
.