【问题标题】:Mongoose: Deleting deeply nested array subdocumentsMongoose:删除深度嵌套的数组子文档
【发布时间】:2018-03-24 00:15:20
【问题描述】:

我正在开始我的第一个真正的项目,并且一直对如何在 Mongoose 中处理嵌套子文档感到沮丧。

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

例如对于看起来像这样的架构:

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 文档。

感谢您的帮助!


编辑:
比我更有知识的人告诉我,不推荐这样的深层嵌套。将嵌套限制在一层深度并将内容拆分为与引用相关的自己的文档对我来说会更好吗?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您是否需要以原子方式发生这种情况?您提供的操作是原子操作,它在其中找到文档并在一次操作中更新它。

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

    根据您对数据存储机制的编辑,它会有所不同。您是否经常需要将子文档与父文档结合使用?如果您总是需要子文档并且这种删除很少见,我认为可以像这样嵌套。如果您很少需要加入子文档并且这种删除很常见,您可能希望将其规范化到它自己的集合中。会有多少个子文档?如果有很多,您可能希望将其分开。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2021-04-29
      • 2021-03-29
      • 2014-12-02
      • 2021-02-10
      • 2021-04-17
      • 2014-03-30
      相关资源
      最近更新 更多