mongoose保存如果新的refs

如果你想知道这个线程中的问题有两个字:我试图完成一个mongoose函数findOrAdd():如果我正在search的ID不存在,我应该添加一个新的文档。 之后(这就是为什么我需要一些同步function),我需要做一个基于新的ObjectIds的查询。

这是我的Post Schema

var com_post_schema = new Schema({ content: { type: String, required: true }, postedBy: [{ type: mongoose.Schema.Types.ObjectId, ref: 'com_user' }] }); 

和我的用户架构

 var com_user_schema = new Schema({ name: { type: String, required: true }, age: {type:Number} }); 

所以一个post可以有多个作者。 我的问题:作者可以是一个现有的用户(在bootstrap-tokenfield中select)或新用户,请参阅此json示例:

 { "content":"post content", "postedBy":[ { "_id":"56a60a972b70225014753d1a", "name":"Paul", "age":20, "__v":0, "value":"Paul", "label":"Paul" }, { "value":"John", "label":"John" } ] } 

用户Paul已经存在于'com_user'集合中,我必须将用户John保存在'com_user'中,然后用这两个用户的ObjectIds参考(字段'value'和'label'由bootstrap-tokenfield发送) 。 我不清楚我该怎么做。

编辑 这是我目前的代码,我仍然有同步问题。 我做了一些testing,我看到随机在控制台“添加新帖”,然后“用户没有find..”

试用3个用户,看看..

 app.post('/api/community/posts', function(req,res){ var arr=[],i=0; req.body.postedBy.forEach(function(el){ com_user.findById(el._id, function (err, user) { if(user) { console.log("User found!"); console.log(user); arr.push(mongoose.Types.ObjectId(user._id )); i++; if(i==req.body.postedBy.length-1) { console.log('UFi'+i) console.log(arr) var com_post1= new com_post({ content:req.body.content, postedBy:arr, }); com_post1.save(function(err){ if(!err){ console.log("New post added!"); res.json({"New post added! ":req.body.content}); } else { res.json({"Error adding post":'error'}); error(err) } }); } } else { var com_user1= new com_user({ name:el.label, age: 20 }); com_user1.save(function(err,newuser){ if(err) console.log(err) else { console.log('User not found and just added!'); console.log(newuser) arr.push(mongoose.Types.ObjectId(newuser._id)); console.log(arr) i++; if(i==req.body.postedBy.length-1) { console.log('NUFi'+i) console.log(arr) var com_post1= new com_post({ content:req.body.content, postedBy:arr, }); com_post1.save(function(err){ if(!err){ console.log("New post added!"); res.json({"New post added! ":req.body.content}); } else { res.json({"Error adding post":'error'}); error(err) } }); } } }); } }); }); }); 

它是因为forEach之前的代码在forEach完成之前得到执行。 像这样尝试

 app.post('/api/community/posts', function(req,res){ var arr=[],i=0; req.body.postedBy.forEach(function(el){ com_user.findById(el._id, function (err, user) { if(user) { console.log("User found!"); console.log(user); arr.push(mongoose.Types.ObjectId(user._id )); i++; if(i==req.body.postedBy.length-1) { //to ensure forEach is complete console.log(arr) var com_post1= new com_post({ content:req.body.content, postedBy:arr, }); com_post1.save(function(err){ if(!err) res.json({"New post added! ":req.body.content}); else { res.json({"Error adding post":'error'}); error(err) } }); } } else { var com_user1= new com_user({ name:el.label, age: 20 }); com_user1.save(function(err,newuser){ if(err) console.log(err) else { console.log('User not found and just added!'); console.log(newuser) arr.push(mongoose.Types.ObjectId(newuser._id)); i++; if(i==req.body.postedBy.length-1) { console.log(arr) var com_post1= new com_post({ content:req.body.content, postedBy:arr, }); com_post1.save(function(err){ if(!err) res.json({"New post added! ":req.body.content}); else { res.json({"Error adding post":'error'}); error(err) } }); } } }); } }); 

});