2017-10-12 10 views
0

私は、このコマンドを実行します。

var news = { 
    _id: req.body.newsItemId, 
    images: { 
     _id: new ObjectId(), 
     src: result 
    } 
} 

Shop.findOneAndUpdate({ 
    _id: ObjectId(req.body.shopId), 
    'news._id': ObjectId(req.body.newsItemId)}, 
    {"$set": { 
     "news.$": news 
    } 
}).exec(function(err, shop){ 
    console.log(err, shop); 

}) 

非既存のフィールドnewsオブジェクトからは、空の値で上書きされているので、それらを文書から削除されます。

ニュースはショップのサブ文書です。したがって、ドキュメントは次のようになります。

name: 'test shop', 
email: '[email protected]', 
products: [], 
news: [ 
    { 
     name: 'test news', 
     content: 'lorum ipsum....', 
     summary: 'lorum', 
     images: [ 
      { 
      src: 'news/image_1.jpg', 
      } 
     ] 
    } 
] 

ニュースを実行した後、ニュースにはidと1イメージしか含まれません。私は画像の配列を上書きし、他のプロパティだけを残しておきたい。私はセット内の画像だけで試しましたが、このエラーが発生するのはMongoose update 'cannot use the part (..) to traverse the elementです。

+3

よく ''news。$':news'は、基本的にはマッチしたオブジェクト全体を上書きしようとしています。あなたはいつも '$ set:{'news。$。content':newContent}'のようなことをすることができます。配列のネストは実際には賢明ではありません.MongoDB 3.6まではまだ更新がサポートされていません。内側の "images"配列内のエントリを "更新"するか、内側の配列に新しいエントリを "追加"するかは明確ではありません。後者は単純です。前者はハードコーディングされたインデックスを使用せずに現在可能ではありません。 –

+0

ありがとうございます。実際は簡単でした。 $を 'news。$。images'に、変数を' [{src: 'image.jpg'}]に変更しました。 – NVO

答えて

0

はこれにコードを変更することでこれを解決:

var images = [{ 
    src: result 
}] 


Shop.findOneAndUpdate({ 
    _id: ObjectId(req.body.shopId), 
    'news._id': ObjectId(req.body.newsItemId)}, 
    {"$set": { 
     "news.$.images" : images 
    } 
    }).exec(function(err, shop){ 
     console.log(err, shop); 
     return res.status(200).json({message: 'OK'}); 
    }) 

だから画像のみオブジェクトが今上書きされ、そしてそれは私が欲しいものです。

関連する問題