Node.js nodejs+;Mongodb:按顺序插入到两个集合中会在第二秒内重复最后一个值
我使用下面的代码插入MongoDBNode.js nodejs+;Mongodb:按顺序插入到两个集合中会在第二秒内重复最后一个值,node.js,database,mongodb,Node.js,Database,Mongodb,我使用下面的代码插入MongoDB var tagData = JSON.parse(data); var allTags = tagData.tags; for (var j = 0; j < allTags.length; j++) { var p = allTags[j].tagId.toString(); for (var k = 0; k < loggerParams.length; k++) { var q = Object.keys(lo
var tagData = JSON.parse(data);
var allTags = tagData.tags;
for (var j = 0; j < allTags.length; j++) {
var p = allTags[j].tagId.toString();
for (var k = 0; k < loggerParams.length; k++) {
var q = Object.keys(loggerParams[k]).toString();
if (p === q) {
// Prepare raw data tag
var tagRawDoc = {};
// Simple key-value assignment here
// Document prepared; ready to insert into MongoDB
database.addDocument('tagraw', tagRawDoc, function (err) {
if (err) {
log.info(util.format('Error adding document to tagrawdatas. %s', err.message));
throw err;
} else {
// Prepare history tag
var historyTagDoc = {};
historyTagDoc.tagNameAlias = tagRawDoc.tagNameAlias;
// Simple key-value assignment here
// Document prepared; ready to insert into MongoDB
database.addDocument('taghistory', historyTagDoc, function (err) {
if (err) {
log.info(util.format('Error adding document to tagrawdatas. %s', err.message));
throw err;
}
});
}
});
// Match found; exit loop
break;
}
}
}
这是因为您将一个/多个同步
for
和异步代码与database.addDocument
混合在一起,这会导致nodejs中的功能范围出现问题
这类事情的一个简单例子:
for(var i = 0; i < 10; i++){
setTimeout(() => console.log(i), 0);
}
这是因为您将一个/多个同步
for
和异步代码与database.addDocument
混合在一起,这会导致nodejs中的功能范围出现问题
这类事情的一个简单例子:
for(var i = 0; i < 10; i++){
setTimeout(() => console.log(i), 0);
}
由于此代码不使用下标,我猜,
allTags
中的每个条目现在都是tag
,而loggerParams
中的每个条目现在都是loggerParam
。这是正确的吗?是的,我使用数组获取q
变量,而不是执行2循环。查找以避免在无效值上异步循环。明白了。在准备tagRawDoc
时,我确实是指tag
和loggerParam[q]
;但是,数据库中插入了null
值。让我再调试一些…使用tag
和loggerParams[q]
,它应该可以解决您的问题。loggerParams
是一个对象数组(我应该在前面提到)。因此,q
将是一个我需要其值的对象。我尝试了q[Object.keys(q)]
-测试了它(这里)[.但是,在运行时,我得到一个错误,如TypeError:Cannot convert undefined或null to object
顺便说一句,匹配是有保证的。由于此代码不使用下标,我猜,allTags
中的每个条目现在都是tag
,而loggerParams
中的每个条目现在都是loggerParam
,这是正确的吗ct?是的,我没有做2次循环,而是使用数组获取q
变量。查找以避免在无效值上异步循环。明白了。在准备tagRawDoc
时,我确实指的是tag
和loggerParam[q]
;但是,数据库中插入了null
值。让我再调试一些…使用tag
和loggerParams[q]
,它应该可以解决您的问题。loggerParams
是一个对象数组(我应该在前面提到)因此,q
将是一个我需要其值的对象。我尝试了q[object.keys(q)]
-测试了它(这里)[。但是,在运行时,我得到了一个错误,因为TypeError:无法将未定义或null转换为object
顺便说一句,匹配是有保证的。
var async = require('async');
var tagData = JSON.parse(data);
var allTags = tagData.tags;
async.each(allTags, function(tag, done){
var p = tag.tagId.toString();
var loggerParam = loggerParams.find(function(loggerParam){
var q = Object.keys(loggerParam).toString();
return p === q;
});
var tagRawDoc = {};
// Simple key-value assignment here
// Document prepared; ready to insert into MongoDB
return database.addDocument('tagraw', tagRawDoc, function (err){
if (err) return done(err);
// Prepare history tag
var historyTagDoc = {};
historyTagDoc.tagNameAlias = tagRawDoc.tagNameAlias;
// Simple key-value assignment here
// Document prepared; ready to insert into MongoDB
return database.addDocument('taghistory', historyTagDoc, done);
});
}, (err) => {
if(err) throw err;
console.log('All done');
});