Mongoose:删除深层嵌套的数组子文档

时间:2018-03-24 00:15:20

标签: node.js mongodb express mongoose

我正在开始我的第一个真正的项目,并且在如何处理Mongoose中的嵌套子文档时遇到了挫折。

删除嵌套2或3次的子文档的最佳方法是什么,我们不知道数组的确切索引?

e.g。对于看起来像这样的架构:

var showSchema = new mongoose.Schema({
    title: String,
    description: String,
    seasons: [{
        name: String,
        videos: [{
            description: String,
            url: String,
            comments: [{
                content: String,
                authorName: String,
            }]
        }]
    }]
});

我已经看到过使用类似的内容:

Show.findByIdAndUpdate({'_id': showId, 'seasons._id': seasonId}, {'$pull': {'seasons.$.videos': {'videos._id': videoId}}}, function(err)...

或类似的东西。

如果我们想要删除评论怎么办?注释进一步嵌套,AFAIK MongoDB只允许一个$。就我而言,我不知道任何这些数组的索引。

Mongoose有没有我们可以使用的方法?我还没有多看一下Mongoose的文档。

我感谢任何帮助!

修改
有人比我更了解我,不推荐像这样的深层筑巢。将嵌套限制在一个深度并将其拆分为与引用连接的自己的文档会不会更好?

1 个答案:

答案 0 :(得分:0)

你需要原子地发生这种情况吗?您提供的操作是一个原子操作,它在一个操作中找到文档并更新它。

如果你不需要以原子方式发生这种情况,你可以简单地请求文档,将其编辑为javascript对象,以便删除嵌套的子文档,然后将编辑后的文档保存回商店。

根据您对数据存储机制的编辑,它将依赖于它。您是否经常需要将子文档与父文档结合使用?如果您总是需要子文档并且这种删除很少,那么在我看来可以这样嵌套。如果您很少需要加入子文档并且这种删除很常见,那么您可能希望将其标准化为它自己的集合。有多少子文档?如果有很多,你可能希望将它分开。

(根据您的数据结构名称猜测,我个人建议在这种情况下将评论作为单独的集合)