[英]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.