我想在我的文章中添加多个评论(猫鼬)

时间:2020-01-23 09:45:33

标签: javascript mongodb mongoose backend

我正在创建一个网站,我想播种一些数据。

我想创建两篇文章,每篇文章都有两个评论:

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;

3 个答案:

答案 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.maparticletData创建新数组,并分配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 }));
  ...

使用Promise.then()

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();
    }
  });
});