代码之家  ›  专栏  ›  技术社区  ›  Abderrahman Gourragui

将元素推入嵌套数组mongoose NodeJ

  •  4
  • Abderrahman Gourragui  · 技术社区  · 8 年前

    我试图将新元素推入数组,我在基于express/nodejs的api上使用mongoose。以下是猫鼬的代码:

    Serie.updateOne({'seasons.episodes.videos._id': data._id}, {$push: {'seasons.episodes.videos.$.reports': data.details}},
        function(err) {
          if (err) {
            res.status(500).send()
            console.log(err)
          }
          else res.status(200).send()
        })
    

    至于我的系列车型,看起来是这样的:

    const serieSchema = new mongoose.Schema({
      name: {type: String, unique:true, index: true, text: true},
      customID: {type: Number, required: true, unique: true, index: true},
      featured: {type: Boolean, default: false, index: true},
      seasons: [{
        number: Number,
        episodes: [{number: Number, videos: [
          {
            _id: ObjectId,
            provider: String,
            reports: [{
              title: {type: String, required: true},
              description: String
            }],
            quality: {type: String, index: true, lowercase: true},
            language: {type: String, index: true, lowercase: true},
          }
          ]}]
      }],
    });
    

    当我执行代码时,我得到了MongoDB错误代码16837,这表示“无法使用部分(季节的季节。剧集。视频。0。报告)来遍历元素(我在json上的元素)”

    我尝试了很多其他的查询来解决这个问题,但都没有成功,我希望有人能解决这个问题。

    1 回复  |  直到 8 年前
        1
  •  11
  •   mickl    8 年前

    在您的查询中使用 位置运算符 ($sign)按id本地化一个特定视频,然后将一个项目推送到报告中。

    问题是MongoDB不知道要更新哪个视频,因为您指定的路径( 季节。剧集。视频$。报告 )包含其他两个数组(季节和集)。

    正如文档所述,您不能多次使用此运算符

    位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值

    这种限制使您的情况复杂化。您仍然可以更新报告,但需要知道外部数组的确切索引。下面的更新就是一个有效的例子:

    db.movies.update({'seasons.episodes.videos._id': data._id}, {$push: {'seasons.0.episodes.0.videos.$.reports': data.details}})
    

    或者,您可以在节点中更新此文档的较大部分。或者重新思考您的模式设计,牢记技术限制。