Javascript NodeJS+;mongoose正在等待子查询
我有两个模型:Javascript NodeJS+;mongoose正在等待子查询,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有两个模型:ModelA和ModelB,我试图将tags=Array()列从ModelB复制到ModelA,如下所示: function run() { ModelA.find({}).limit(500).cursor() .on('data', function(doc) { let refID = doc.ref_id; ModelB.findOne({_id: refID}).exec(function(err, modelb) {
ModelA
和ModelB
,我试图将tags=Array()
列从ModelB
复制到ModelA
,如下所示:
function run() {
ModelA.find({}).limit(500).cursor()
.on('data', function(doc) {
let refID = doc.ref_id;
ModelB.findOne({_id: refID}).exec(function(err, modelb) {
if (err) {
console.log(`[Error]: Getting modelb ${refID}`);
}
if (modelb) {
if (modelb.tags.length > 0) {
doc.tags = modelb.tags;
}
}
});
doc.processed = true;
doc.save(function(err, hackAlert) {
if (err) {
console.log('[Error]: Saving ModelA: ' + err);
}
console.log(`Saved: ${doc._id}`);
});
})
.on('error', function(err){
console.log('[Error]');
})
.on('end', function(){
console.log('Done');
});
}
脚本显然使用processed=true
保存了所有ModelA
实例,但考虑到节点的异步性质,ModelA
文档最终没有标记
如果你不知道的话,我是新手。我想知道在保存ModelA
之前完成ModelB.findOne()
查询的等待的最佳现代方式是什么?您只需移动要在第一次查询回调时调用的代码:
function run() {
ModelA.find({}).limit(500).cursor()
.on('data', function(doc) {
let refID = doc.ref_id;
ModelB.findOne({_id: refID}).exec(function(err, modelb) {
if (err) {
console.log(`[Error]: Getting modelb ${refID}`);
}
if (modelb) {
if (modelb.tags.length > 0) {
doc.tags = modelb.tags;
}
}
doc.processed = true;
doc.save(function(err, hackAlert) {
if (err) {
console.log('[Error]: Saving ModelA: ' + err);
}
console.log(`Saved: ${doc._id}`);
});
});
})
.on('error', function(err){
console.log('[Error]');
})
.on('end', function(){
console.log('Done');
});
}
对于使用async/await
和Promises
的最新方法:
async function run () {
ModelA.find({}).limit(500).cursor()
.on('data', async function (doc) {
let refID = doc.ref_id;
const modelb = await ModelB.findOne({_id: refID}).exec()
.catch(() => console.log(`[Error]: Getting modelb ${refID}`));
if (modelb) {
if (modelb.tags.length > 0) {
doc.tags = modelb.tags;
}
}
doc.processed = true;
await doc.save().exec()
.catch(err => console.log('[Error]: Saving ModelA: ' + err))
console.log(`Saved: ${doc._id}`);
})
.on('error', function (err){
console.log('[Error]');
})
.on('end', function () {
console.log('Done');
});
}
谢谢,我一直在寻找类似于您的第二种方法的东西,第一种方法不适合我,因为findOne
可能找不到任何相关文档,我仍然需要将ModelA
文档保存为processed=true
。谢谢你的帮助没问题!第一种方法也应该更新文档,因为回调
无论如何都应该执行,但第二种方法更干净。