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

时间:2017-03-03 13:40:13

标签: node.js mongoose promise async-await async.js

我很难在mongoDb中保存数据。这里的数据是数组,我需要插入数据,如果mongodb没有。请看代码: -

if

按照上面的代码,它必须插入六个文件而不是一个。我认为上面的迭代不等待完成前一个。因此,false条件始终为else并执行string hex_decode(string hex_input)

2 个答案:

答案 0 :(得分:2)

您的saveContact()功能正常。您获得6个文档而不是1个文档的原因是async.map()并行运行代码。所有6个请求都是并行进行的,而不是一个接一个地进行。

来自async.map()功能的文档 -

  

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

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

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

您应该尝试使用async.mapSeries()运行代码来连续处理您的请求。只需在上面的代码中将map()替换为mapSeries()即可。这样它将等待一个请求完成然后执行另一个请求,因此只会创建一个文档。有关async.mapSeries() here的更多信息。

答案 1 :(得分:1)

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

首先,async.map()只有3个参数(例如colliterateecallback),为什么你有4个?在您的情况下,collcontactPersonDataiteratee是您的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