Node.js Mongoose添加对象数组
我正在创建一个简单的博客,其中有包含标签的帖子Node.js Mongoose添加对象数组,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在创建一个简单的博客,其中有包含标签的帖子 var postSchema = new Schema ({ title: { type: String, required: true }, content: { type: String, required: true }, tags: [{ type: Schema.Types.ObjectId, ref: 'Tag' }] }); 当用户发布帖子时,我会将标签作为标签名数组来获取。我如何循环浏览这些标签,创建它们,并在第一次保
var postSchema = new Schema ({
title: { type: String, required: true },
content: { type: String, required: true },
tags: [{ type: Schema.Types.ObjectId, ref: 'Tag' }]
});
当用户发布帖子时,我会将标签作为标签名数组来获取。我如何循环浏览这些标签,创建它们,并在第一次保存时将它们添加到帖子中
我试过这个:
var post = Post({
title: data.title,
content: data.content
});
data.tags.forEach(function(name) {
Tag.findOrCreate({ name: name }, function(err, tag, created) {
post.tags.push(tag);
post.save(function(err) {
if (err) throw err;
console.log('Post saved!');
});
});
});
但这迫使我为每个标签再次保存帖子。有没有办法只保存一次?当然,您可以只调用一次
.save()
,只需在处理循环后将其移动到。当然,由于这里的所有调用都是“异步”的,那么您需要更好地控制它,以便知道每个操作的回调何时完成:
在此处使用库作为辅助对象:
var post=post({
标题:data.title,
内容:data.content
});
eachLimit(data.tags,5,函数(名称,回调){
findOrCreate({“name”:name},函数(err,Tag){
如果(错误)回调(错误);
post.tags.push(标签);
回调();
});
},函数(err){
if(err)抛出err;//或一些处理,因为所有错误都出现在这里
保存(函数(err,post){
})
});
因此,there允许在处理数组元素的每次完成时触发“回调”。“限制”部分实际上只确保同时运行多个操作,这样就不会占用堆栈或可用连接
当处理列表中的所有项并返回回调函数时,将执行其中的最后一个块,因此,当所有项都已创建或找到并且相应的数据推送到数组中准备保存时
同样,如果该循环中出现任何“错误”,则执行将交给最后一个块,以便在同一位置处理所有错误操作。@investivepanda如果您有其他问题,请使用链接发布。您刚刚了解到,您需要尊重异步执行的“流控制”。如果你有更具体的问题要问他们,那么就把它们发出去,有人会回答的。