更新双嵌套阵列MongoDB



考虑此架构:

let userSchema = new mongoose.Schema({
id: String,
displayName: String,
displayImage: String,
posts: [
    {
        url: String,
        description: String,
        likes: [String],
        comments: [
            { content: String, date: String, author: { id: String, displayName: String, displayImage: String } }
        ]
    }
]
});

我可以使用此查询从注释数组中删除某些项目

controller.deleteComment = (req, res, next) => {
User.findOneAndUpdate(
    { id: req.query.userid, 'posts._id': req.params.postid, },
    {
        $pull: {
            'posts.$.comments': { _id: req.body.commentID },
        }
    }
)
    .exec()
    .then(() => {
        res.send('deleted');
    })
    .catch(next);
};

无论如何,我可以使用$set操作员在注释数组中更新一个元素吗?我需要根据评论ID更改评论的内容。类似的内容:

controller.editComment = (req, res, next) => {
    User.findOneAndUpdate(
        { id: req.query.userid, 'posts._id': req.params.postid, 'comments._id':req.body.commentID },
        {
            $set: {
                'posts.$.comments': {  content: req.body.edited },
            }
        }
    )
        .exec()
        .then(() => {
            res.send('deleted');
        })
        .catch(next);
};

这个 ^显然不起作用,但我想知道我是否有办法做到这一点?

更新根据下面的建议,我正在采取以下操作以管理一个模式。但是,无论我编辑哪些帖子评论,只有第一篇文章的评论才能更新。我已经检查了,返回文档始终是正确的。doc.save()方法必须有问题。

controller.editComment = (req, res, next) => {
User.findOne(
    { id: req.query.userid, 'posts._id': req.params.postid },
    { 'posts.$.comments._id': req.body.commentID }
)
    .exec()
    .then((doc) => {
        let thisComment = doc.posts[0].comments.filter((comment) => { return comment._id == req.body.commentID; });
        thisComment[0].content = req.body.edited;
        doc.save((err) => { if (err) throw err; });
        res.send('edited');
    })
    .catch(next);
};

我不知道实现自己正在尝试做的事情的简单(甚至很难:p(。在Mongo,在双嵌套阵列中的操纵相对较难,因此最好避免。

如果您仍在开放架构更改,我建议您为评论创建一个不同的架构,并在用户架构中引用该模式。

所以您的评论模式看起来像这样:

let commentSchema = new mongoose.Schema({
     content: String, 
     date: String,
     author: { 
          id: String,
          displayName: String,
          displayImage: String
     }
});

您的用户模式应该看起来像这样:

let userSchema = new mongoose.Schema({
     id: String,
     displayName: String,
     displayImage: String,
     posts: [{
        url: String,
        description: String,
        likes: [String],
        comments: [{
            type: Schema.Types.ObjectId,
            ref: 'comment'   //reference to comment schema
        }]
    }]
});

这样,您的数据操作将变得容易得多。您可以在获取用户文档时填充注释。并且,请注意,鉴于您已经知道要更新的注释中的_id的更新/删除操作。

希望您发现这个答案有帮助!

controller.editComment = (req, res, next) => {
    User.findOneAndUpdate(
        { id: req.query.userid, 'posts._id': req.params.postid, 'comments._id':req.body.commentID },
        {
            $push: {
                'posts.$.comments': {  content: req.body.edited },
            }
        }
    )
        .exec()
        .then(() => {
            res.send('deleted');
        })
        .catch(next);
};

相关内容

  • 没有找到相关文章

最新更新