簡體   English   中英

貓鼬添加對象數組

[英]Mongoose add array of objects

我正在創建一個簡單的博客,其中包含包含標簽的帖子。

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()一次,只需在處理完循環后將其移至。 但是當然,由於這里的所有調用都是“異步的”,因此您需要對其進行更好的控制,以便您知道對每個操作的回調何時完成:

在這里使用async庫作為助手:

var post = Post({
  title: data.title,
  content: data.content
});

async.eachLimit(data.tags, 5, function(name,callback) {
    Tag.findOrCreate({ "name": name },function(err,tag) {
        if (err) callback(err);
        post.tags.push(tag);
        callback();
    });        
},function(err) {
   if (err) throw err;   // or some handling as all errors come here
   post.save(function(err,post) {

   })
});

因此,那里的async.eachLimit允許在處理數組元素的每次完成時觸發“回調”。 實際上,“限制”部分確保僅同時運行許多操作,因此您不會浪費堆棧或可用連接。

當列表中的所有項目都已處理並且回調函數返回時,將執行最后一個塊,因此,在創建或找到所有項目並將相應的數據壓入數組后,即可進行保存。

同樣,如果在該循環中發生任何“錯誤”,則將執行交給該最終塊,以便也可以在一個地方處理所有錯誤操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM