如何使用Mongoose将数组数据保存在nodejs中



我被困在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()函数文档 -

请注意,由于此函数将iTerateE应用于每个项目,因此无法保证IterateE函数将按顺序完成。

在数据库中创建文档之前,所有查询都已经运行,并且所有6个查询都无法找到该文档,因为它仍在创建过程中。因此,您的saveContact()方法创建了所有6个文档。

如果您再次运行代码,则将不再形成任何文档,因为到那时您的文档将被形成。

您应该尝试使用async.mapSeries()运行代码以串行处理您的请求。只需在您的上述代码中用mapSeries()替换map()即可。这样,它将等待一个请求完成,然后执行另一个请求,结果将仅创建一个文档。在此处的async.mapSeries()上的更多信息。

您似乎正在使用async.map()错误。

首先,async.map()只有3个参数(即colliterateecallback),那么为什么有4个?就您而言,coll是您的contactPersonDataiteratee是您的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

最新更新