将元素推入嵌套数组mongoose nodejs

时间:2017-11-27 12:30:56

标签: node.js mongodb mongoose mongodb-query mongoose-schema

我正在尝试将新元素推送到数组中,我在基于express / nodejs的api上使用mongoose。这是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,其中说“不能使用部分(season.episodes.videos.0.reports的季节)遍历元素(我的元素在json上)”

我已经尝试了很多其他问题来解决这个问题,但没有一个能够解决,我希望有人可以解决这个问题。

1 个答案:

答案 0 :(得分:3)

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

问题是MongoDB不知道您尝试更新哪个视频,因为您指定的路径( seasons.episodes.videos。$。reports )包含另外两个数组(季节和剧集)。

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

  

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

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

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

或者,您可以在node.js中更新此文档的更大部分,或重新考虑您的架构设计,同时牢记技术限制。