2017-11-27 14 views
0

私は新しい要素を配列にプッシュしようとしています。私はexpress/nodejsベースのapiでmongooseを使用しています。ここではマングースのためのコードです:私のシリーズモデル用として要素をネストされた配列にプッシュmongoose nodejs

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を取得します要素を横断する部分(seasons.episodes.videos.0.reportsの季節)(ここでは、JSONの私の要素)」

私はこの問題を解決するために、他の多くのクエリを試してみたが、どれも働いていない、私は誰かがことを願っこれを把握してください。

答えて

2

位置演算子($記号)を使用して、特定の動画を_idでローカライズし、レポートに1つのアイテムをプッシュしたいとします。

問題はMongoDBのは、あなたが指定したパスので更新しようとしているどのビデオわからないということである(seasons.episodes.videosを。$。を報告する)他の二つのアレイ(季節やエピソード)が含まれています。

ドキュメントは、あなたが位置$オペレータは、他のアレイ内にネストされたアレイを横断クエリとして複数のアレイを横断クエリのために使用することができない複数

この演算子を使用することができない状態として$プレースホルダーの置き換えが単一の値であるためです

この制限は状況を複雑にします。レポートを更新することはできますが、外部配列の正確なインデックスを知る必要があります。したがって、次の更新は、実施例のようになります。

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

別の方法としては、Node.jsの中で、この文書の大きな部分を更新したり、心の技術の限界でのスキーマ設計の維持を再考することができます。

+0

ありがとうございます、私はより良い研究を事前にしておかなければなりません。 –

関連する問題