2017-09-08 15 views
0

次の条件に一致するすべての文書を更新しようとしています。複数の文書を更新できません

何らかの理由で、consoleにalerts.saveが機能ではないというエラーが表示されます。

これは私の記録を更新した方法です。

複数のドキュメントを更新しようとしていますか?ここで

router.route('/mark_as_read/:ownerId') 
.put(function(req, res){ 

    var alerts = new Alerts(); 

    Alerts.find({owner_id: req.params.ownerId}, function(err, alerts){ 
    if(err) 
     res.send(err); 

    alerts.viewed = true; 
    console.log('Alerts: ', alerts); 

    alerts.save(function(err){ 
     if(err) 
     res.send(err); 
     res.json(alerts) 
    }); 
    }); 
}); 

私は、getを行うときに返されるデータの一例である:

{ _id: 59aed31e78fbbea611518ddf, 
    message: 'Hammer Hammer at [email protected]', 
    alert_type: 'Share', 
    owner_id: '59a6e66d5ab67150837d96a8', 
    __v: 0, 
    viewed: false, 
    date: 2017-09-05T16:38:54.437Z }, 
    { _id: 59aed6035fee3fa895045693, 
    message: 'Paul Pataa at [email protected]', 
    alert_type: 'Share', 
    owner_id: '59a6e66d5ab67150837d96a8', 
    __v: 0, 
    viewed: false, 
    date: 2017-09-05T16:51:15.193Z }, 
    { _id: 59aedba6fec346aafae9121c, 
    message: 'Marky Mark at [email protected]', 
    alert_type: 'Share', 
    owner_id: '59a6e66d5ab67150837d96a8', 
    __v: 0, 
    viewed: false, 
    date: 2017-09-05T17:15:18.876Z }, 
    { _id: 59aedc36fec346aafae91228, 
    message: 'Lilly Lap at [email protected]', 
    alert_type: 'Share', 
    owner_id: '59a6e66d5ab67150837d96a8', 
    __v: 0, 
    viewed: false, 
    date: 2017-09-05T17:17:42.951Z } 

私は、アラートの配列を反復処理しようとしたが、これは私のために動作しませDIS:

router.route('/mark_as_read/:ownerId') 
.put(function(req, res){ 

    var alerts = new Alerts(); 

    Alerts.find({owner_id: req.params.ownerId}, function(err, alerts){ 
    if(err) 
     res.send(err); 

    for(var i=0; i < alerts.length; i++){ 
     alerts.viewed = true; 
     alerts[i].save(function(err){ 
     if(err) 
      console.log('Error in updating an alert'); 

     }) 
    } 
    }); 
}); 

答えて

1

メソッドを検索すると配列が返されるので、alerts.save()は機能しません。

アレイ全体を反復処理し、アレイ内の各ドキュメントにという名前のsave()を呼び出す必要があります。

代わりに、findOneを使用して1つのドキュメントを返すこともできます。

+0

ありがとうSteve。意味をなさない私はアラートアレイ上のループで私の例を更新しましたが、これはうまくいきませんでした。どこでも私はこれを扱う明確な例を見ることができますか?ご協力いただきありがとうございます!! – cnak2

+0

この行には** alerts.viewed = true **配列**の** viewed **プロパティを参照しようとしています。 ** save **呼び出しが非同期ですが、forループが同期するので、このようにすると問題が発生する可能性があります。したがって、私は** findOne **または** findById **を使用することをお勧めします。 –

+0

私は実際に同じowner_idを持つすべてのドキュメントを更新しようとしています。私の場合、findOneまたはfindByIdを使用することはできません。複数のドキュメントを簡単に更新する方法が必要です。 .updateメソッドを使用してmongoでそれを行う方法を見つけましたが、それは私の明示的なアプリケーションでは機能しません。コレクションを検索し、返される各ドキュメントの1つのフィールドを変更したことがありますか?それは私の挑戦です。再度、感謝します。答えは私の目の前にあると確信しています。私はまだそれを得ていないだけです。 :-) – cnak2

関連する問題