如何使用 .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 查询及批量插入