如何使用 .forEach() 插入多个集合并检查它是不是存在

Posted

技术标签:

【中文标题】如何使用 .forEach() 插入多个集合并检查它是不是存在【英文标题】:How to insert Multiple collections using .forEach() and check if it exist or not如何使用 .forEach() 插入多个集合并检查它是否存在 【发布时间】:2017-10-08 22:12:15 【问题描述】:

我想使用 .forEach() 将多个用户详细信息插入到我的 Mongodb 数据库中。 在插入记录之前,我想检查用户记录是否存在。如果用户不存在,则插入新的用户记录,否则更新现有的用户记录。

下面是

var dataArray=[
        "id":"1","name":"abc","email":"abc@gmail.com",
        "id":"2","name":"xyz","email":"xyz@gmail.com",
        "id":"1","name":"abc","email":"abc@gmail.com",
         ];

dataArray.forEach(function(dataVar)

//check record exist or not

User.findOne(id:dataVar.id,function(err,user)
    if(!user)// Insert If user not exist
        var userSchema=new User(
            id:dataVar.id,
            name:dataVar.name,
            email:dataVar.email
        );
        userSchema.save(function(err,result)
        console.log('New Record Inserted');     
        )
    else // Update records if user exist
        User.update(id:dateVar.id,email:dataVar.email,function(err,result)
        console.log('Record Updated');;     
        ); 
    
)
);

运行此代码 sn-p 时,它仅检查数组中的第一个对象并插入我的数据库。但是下次当第三个对象要执行时,它不会像新记录一样检查和插入。

我不明白发生了什么。

请告诉我如何解决。

谢谢。

【问题讨论】:

您正在使用forEach 在数组迭代中混合异步操作和同步操作。您需要异步迭代。查看async 库,它是为控制流(异步内容)而设计的,它有很多用于数组内容的方法。你可能在这里需要async.forEach(arr, iterator, callback) 方法。 是的,现在它与async 合作。 ..谢谢 【参考方案1】:

你应该做你的循环异步

见:https://caolan.github.io/async/docs.html#eachOfSeries

示例代码

var dataArray = [
    "id": "1",
    "name": "abc",
    "email": "abc@gmail.com"
, 
    "id": "2",
    "name": "xyz",
    "email": "xyz@gmail.com"
, 
    "id": "1",
    "name": "abc",
    "email": "abc@gmail.com"
, ];

async.eachOfSeries(dataArray, function(dataVar, key, callback) 
    User.findOne(
        id: dataVar.id
    , function(err, user) 
        if (!user)  // Insert If user not exist
            var userSchema = new User(
                id: dataVar.id,
                name: dataVar.name,
                email: dataVar.email
            );
            userSchema.save(function(err, result) 
                console.log('New Record Inserted');
                callback();
            )
         else  // Update records if user exist
            User.update(
                id: dateVar.id
            , 
                email: dataVar.email
            , function(err, result) 
                console.log('Record Updated');;
                callback();
            );
        
    )
, function(err) 
    if (err) console.error(err.message);
    // configs is now a map of JSON data
    console.log("All done")
);

【讨论】:

谢谢,现在它可以工作了......我想知道一件事,如果我的数组中有 5k+ 个对象,那么它会很好用吗? 这应该可以,但也许您可以对数组进行预处理,以便最终得到一个数组,其中每个对象都有一个唯一的 ID。 (所以迭代数组,创建一个新的(或者可能是键值对象),并将每个“更新”应用到对象)这样你应该有更少的 db/async 操作。

以上是关于如何使用 .forEach() 插入多个集合并检查它是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

Mybatis 的 foreach 批量模糊 like 查询及批量插入

MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合

使用 foreach 和多个插入行?