我正在构建一个nodejs应用程序,我对nodejs异步模型很新。
问题是我已修改数据库集合以包含字符串字段,而sill引用另一个集合,即我已修改车辆模型以包含名为make name的额外字段作为字符串字段,而不是仅仅引用make集合为了提高效率,我已经完成了这种去标准化,因为这个字段经常被读不写。
摘自数据库架构:
<View style={{flex:1,backgroundColor:'white'}}>
<View style={{justifyContent:'space-around'}}>
<View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',margin:5}}/>
<View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',marginHorizontal:5}}/>
<View style={{height:50,alignSelf:'stretch',backgroundColor:'pink',margin:5}}/>
</View>
<View style={{flex:1,alignItems:'center',justifyContent:'center',alignSelf:'stretch',backgroundColor:'blue',margin:5}}>
<Text style={{color:'white',fontWeight:'bold'}}>
View
</Text>
</View>
</View>
以下是make schema的摘录:
var vehicleSchema = new mongoose.Schema({
stringId: String,
make: {
type: mongoose.Schema.Types.ObjectId, ref:"Make",
makeText: String
},
});
问题是我已经在集合中有一些数据,我需要编写一个代码来循环遍历车辆集合中的车辆,然后查找车辆的make对照制作集合,然后找到相应的制造商名称string并将该值赋给vehicle.make.makeText
我做了大量的研究,我到达了asyn模块,下面是我为解决这个问题而编写的代码:
var makeSchema = new mongoose.Schema({
name: String,
models: [modelSchema]
遗憾的是,代码似乎只执行一次而且我没有看到vehicle.save方法的效果,因为我无法看到对DB的更改。
提前致谢
答案 0 :(得分:1)
我认为你没有使用eachOfSeries http://caolan.github.io/async/docs.html#eachOfSeries
应用于coll中每个项目的函数。关键是物品的钥匙, 或者在数组的情况下索引。 iteratee传递了一个 回调(err),一旦完成就必须调用。如果没有错误 已经发生,回调应该没有参数或运行 显式null参数。使用(item,key,callback)调用。
你得到一个密钥,而不是完整的对象,必须调用回调。
答案 1 :(得分:0)
你忘记了next()
函数,你需要在findById
返回后调用它。没有运行此修复,但它显示了
问题是
> // code to loop through all records in vehicles collection and add
> makeText vehicle.find({},(err,allVehicles) =>{
>
> console.log("executed vehicle.find()");
> async.eachOfSeries(allVehicles,function(vehicle,next){
> console.log(vehicle.stringId);
> make.findById(vehicle.make.id,function(err,foundMake){
> vehicle.make.makeText = foundMake.name;
> console.log(foundMake.name);
> vehicle.save(function(err,saved){
> if(err){
> console.log(err.message);
> next(err)
> }else{
> next();
> }
>
> })
> })
>
> },function(err){
> if (err){
> console.log(err.message);
> }
>
> }
>
> )});