我想在NodeJS中使用promisified函数从MongoDB中聚合数据。 我的转储脚本在这里https://github.com/network-spy/lego使用promisified函数在NodeJS中进行数据聚合
小描述:数据库中有2个集合:“zip”和“restaurants”。 “zip”包含位置的邮政编码,“餐馆”包含有关邮政编码的餐馆的信息。因此,脚本应创建新的收集“统计”,并填写文件如: {“zip_code”:“01002”,“餐馆”:[餐馆清单]}
问题是,在“zip”集合那里是29353个文档,但是在脚本处理之后,我得到了29026个文档的“stat”集合(有时可以改变文档数目)。
我想这是因为在我的JS代码的某处失效。请你看看我的代码和建议如何修复它?
const MongoClient = require('mongodb').MongoClient;
const mongoDbUrl = 'mongodb://127.0.0.1:27017/world';
MongoClient.connect(mongoDbUrl, function(err, db) {
if (err) {
console.log(err);
return;
}
console.log("Connected to server.");
clearStat(db).then(
result => {
console.log(result);
processZips(db).then(
result => {
console.log(result);
closeMongoDBConnection(db);
},
error => {
console.log(error);
closeMongoDBConnection(db);
}
);
},
error => {
console.log(error);
closeMongoDBConnection(db);
}
);
});
let closeMongoDBConnection = (db) => {
db.close();
console.log("Disconnected from server.");
};
let clearStat = (db) => {
return new Promise((resolve, reject) => {
db.collection('stat').deleteMany({}, function(err, results) {
if (err) {
reject(err);
}
resolve('Stat data cleared');
});
});
};
let processZips = (db) => {
return new Promise((resolve, reject) => {
db.collection('zip').find({}, {"_id":1}).each((err, zipCode) => {
if (zipCode == null) {
resolve('Zips precessed');
} else if (err) {
reject(err);
} else {
findRestaurantsByZip(db, zipCode._id).then(
result => {
insertToStat(db, zipCode._id, result).then(
result => {
console.log('Inserted: ');
console.dir(result);
},
error => {
reject(error);
}
);
},
error => {
reject(error);
}
);
}
});
});
};
let findRestaurantsByZip = (db, zipCode) => {
return new Promise((resolve, reject) => {
db.collection('restaurant').find({"address.zipcode": zipCode}).toArray((err, restaurants) => {
if (err) {
reject(err);
}
resolve(restaurants);
});
});
};
let insertToStat = (db, zip, restaurants) => {
return new Promise((resolve, reject) => {
let statDocument = {};
statDocument.zip_code = zip;
statDocument.restaurants = restaurants;
db.collection('stat').insertOne(statDocument).then(
result => {
resolve(statDocument);
},
error => {
reject(error);
}
);
});
};
我在你的git的代码中编辑过,我认为这是问题 - 它只有100行。我在问题中看到了更长,未格式化的代码,因此您应该在可以 –
好时添加代码。感谢您的帮助 –
最新版本的node.js mongodb驱动程序具有对promise的本地支持,因此在您的函数中不需要明确的promise。代码应该显着简化并且更容易调试。 –