names.forEach((o, i) => {
Name.findOneAndUpdate({name: o.name}, o, {upsert: true, 'new': true})
.then(result => {
res.json(result);
})
})
我不能在上面的循环中做res.json,如何处理这种情况?我想找到名字是否存在,如果存在则不做任何事情,否则插入名称。
答案 0 :(得分:1)
首先要读这个。
What is the difference between synchronous and asynchronous programming (in node.js)
你把它混合起来。
要修复您的代码,您可以使用promises ...
例如
do {
let elements = try JSONDecoder().decode([ResponseElement].self, from: data)
let employees = elements.filter { $0.type == .employee }.flatMap(Employee.init)
let employers = elements.filter { $0.type == .employer }.flatMap(Employer.init)
print(employees.count)
print(employers.count)
} catch {
print("Something bad has happened :\(error)")
}
现在你可以运行循环并使用promise all
function runUpdate(obj) {
return new Promise((resolve, reject) => {
//you update code here
Name.findOneAndUpdate({name: obj.name}, {$setOnInsert: obj}, { upsert: true })
.then(result => resolve())
.catch(err => reject(err))
});
});
}
最后
let promiseArr = [];
names.forEach(obj => promiseArr.push(runUpdate(obj)));
关于不更新存在的文件。看一下这个。 https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/#op._S_setOnInsert
希望这有帮助。
答案 1 :(得分:0)
这对我有用
const promises = names.map(async obj =>
await Name.findOneAndUpdate(
{name: obj.name},
obj,
{upsert: true, 'new': true}
)
)
await Promise.all(promises)
console.log('test')
如果运行此代码,您将看到“测试”仅在诺言之后出现。