我正在创建一个网站,我想播种一些数据。
我想创建两篇文章,每篇文章都有两个评论:
var mongoose = require("mongoose"),
Article = require("./models/articles.js"),
Comment = require("./models/comments.js");
var articleData = [
{
title: "Fast Cars",
author: "Steve Novak",
company: "AthLead",
body: "SOME TEXT"
},
{
title: "New Design",
author: "Kevin Garnett",
company: "Revoos",
body: "COOL ARTICLE"
}
];
var commentData = [
{
body: "I really love the new design",
author: "Mark Cuban"
},
{
body: "This is hitting my funny bone",
author: "Lisa Jones"
}
];
我要删除所有过去的评论和文章。
然后针对每篇文章,我首先创建该文章,然后提出两个评论。
在将新形成的文章保存到数据库时遇到问题:
将article.save()置于1会导致并行save()错误发生
置于2时,不会保存任何评论。
function seedDB() {
Comment.deleteMany({}, function (err) {
if (err) {
console.log(err);
}
Article.deleteMany({}, function (err) {
if (err) {
console.log(err);
}
articleData.forEach(function (article) {
Article.create(article, function (err, article) {
if (err) {
console.log(err);
} else {
commentData.forEach(function(comment) {
Comment.create(comment, function (err, comment) {
if (err)
console.log(err);
else {
article.comments.push(comment);
// PROBLEM
// 1. article.save();
}
})
})
// PROBLEM
//2. article.save();
}
});
});
});
});
});
console.log("Database Reset");
}
module.exports = seedDB;
答案 0 :(得分:1)
您目前处于callback hell,使用async/await
会使您的代码更具可读性,因此调试起来很容易。
考虑以下使用async/await
async function seedDB() {
try {
// clean up all comments
await Comment.deleteMany({}).exec()
// clean up all articles
await Article.deleteMany({}).exec()
// create articles
await Article.create(articleData)
// create comments
const comments = await Comment.create(commentData)
// update articles with the new comments
const updatedArticles = await Article.updateMany(
{},
{ '$set': { comments } }
).exec()
console.log(updatedArticles)
} catch (err) {
console.error(err)
}
}
答案 1 :(得分:1)
您可以将文档数组传递给Model.create
,只需先创建comments
,然后使用Array.map
从articletData
创建新数组,并分配comments
每篇文章
使用async/await
:
async function seedDB() {
...
const comments = await Comment.create(commentData);
const articles = await Article.create(articleData.map(article => { article.comments = comments; return article }));
...
function seedDB() {
...
Comment.create(commentData).then(comments =>
Article.create(articleData.map(article => { article.comments = comments; return article })).then(articles => {
});
});
...
答案 2 :(得分:0)
第一次Article.create...
时,成功创建该函数将返回 article 对象,或者在另一侧返回错误。
您需要在新创建的文章中运行forEach循环,以使每篇文章都包含注释。
您需要使用现有的新建文章数据。
示例
articleData.forEach(function (article) {
Article.create(article, function (err, article) {
if (err) {
console.log(err);
} else {
article.update(
{ "_id": ObjectId(article.id) },
{ $push: { comments: commentData } }
);
// OR try something like
// article.comments = commentData
// OR
// article.comments.insert(commentData)
article.save();
}
});
});