如果您想用两个词来了解此线程中的问题: 我正在尝试完成一个猫鼬函数 findOrAdd():如果我正在搜索的 Id 不存在,我应该添加一个新文档。之后(这就是我需要一些同步功能的原因)我需要根据新的 ObjectId 进行另一个查询。
这是我的帖子架构
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}
});
所以一篇文章可以有多个作者。我的问题:作者可以是现有用户(在 bootstrap-tokenfield 中选择)或新用户,请参阅此 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 refs 保存帖子(字段“value”和“label”由 bootstrap-tokenfield 发送) . 我不清楚我该怎么做。
编辑 这是我当前的代码我仍然有同步问题。我做了一些测试,我在控制台中随机看到“添加了新帖子”,然后是“找不到用户..”
尝试 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)
}
});
}
}
});
}
});
});
});