Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose添加对象数组_Node.js_Mongodb_Mongoose - Fatal编程技术网

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如果您有其他问题,请使用链接发布。您刚刚了解到,您需要尊重异步执行的“流控制”。如果你有更具体的问题要问他们,那么就把它们发出去,有人会回答的。