繁体   English   中英

Mongoose-MongoDB-Express:在嵌入式文档中深3级的字段中推送数据

[英]Mongoose - MongoDB - Express: Pushing data in a field that is 3 levels deep in a embedded document

我试图实现或想知道是否有可能将数据放入“ TopicSchema”中的注释字段中:

var mongoose = require('mongoose');

    var TopicSchema = new mongoose.Schema({
        username: String,
        topic: String,
        description: String,
        category: String,
        created_at: {type: Date, default: Date.now},
        posts: [
            {
                postUsername: String,
                post: String,
                postUpvote: {type: Number, default: 0},
                postDownvote: {type: Number, default: 0},
                created_at: {type: Date, default: Date.now},
                comments:  [
                    {
                        commentUsername: String,
                        comment: String,
                        created_at: {type: Date, default: Date.now}
                    }
                ]          
            }
        ]

    });

    mongoose.model('Topics', TopicSchema);

这是到目前为止,当我尝试在TopicsSchema中添加注释时

var Topics = mongoose.model('Topics');

        var topicUpdate = {
            $push: {
                "posts:" {
                    "comments": {
                        commentUsername: req.body.username,
                        comment: req.body.comment
                    }
                }
            }
        }
        Topics.update({_id: req.body.topicId}, topicUpdate, function(err, status) {
            console.log(status);
            if (err) {
                console.log('Error adding comment to topic');
                res.json(false);
            } else {
                console.log('Success adding comment to topic');
                res.json(true);
            }
        })

它在这里插入:

    var topicUpdate = {
        $push: {
            "posts:" {
                "comments": {
                    commentUsername: req.body.username,
                    comment: req.body.comment
                }
            }
        }
    }

它正在添加一个新的posts数组,而不是插入到我在TopicSchema中具有的正确的posts数组中,但是它正在添加一个新的posts字段,并且注释也包含在这些post中,这不是我想要实现的。 我希望将评论分别添加到正确的帖子字段中,而不是每次都添加带有评论的新帖子字段。

我终于解决了它,对于3级深度的嵌入式文档而言,这似乎非常具有挑战性。

我的逻辑是先按主题ID查找主题,然后使用从该主题ID中接收到的数据,首先必须遍历我收到的数据,并且如果帖子ID与我正在寻找的帖子ID相匹配,然后我会将评论推送到该子数组。 之后,我将不得不使用更改后的新数据,然后使用推送注释的数据来更新数据。 我要做的最后一件事是再次找到该主题以发送给客户端。

这是我必须完成的代码:

      Topics.findOne({_id: req.body.topicId}, function(err, data) {
        if (err) { res.json(false) }
        else {
            for (var i = 0; i < data.posts.length; i++) {
                if(data.posts[i]._id == req.body.postid) {
                    data.posts[i].comments.push({comment: req.body.comment, commentUsername: req.body.username });                          }
            }
            Topics.update({_id: req.body.topicId}, data, function(err, status) {
                if (err) { console.log('Error updating whole topic'); res.json(false) }
                else {
                    Topics.findOne({_id: req.body.topicId}, function(err, data) {
                        if (err) {
                            console.log('Error finding comments');
                            res.json(status);
                        } else {
                            console.log('Success getting comments');
                            res.json(data);
                        }
                    }) 
                }
            });

是的我知道。 我学到的教训是现在不要在此类应用程序中深入使用3个级别的嵌入式文档。 但是,嘿! :)并且希望我也已经帮助了某人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM