2016-03-24 6 views
2

私は流星アプリを持っています。位置演算子を使ってサーバーサイドからmongoドキュメントを更新したいと思います。私はまた値votedを増やしたいと思う。

私のmongo文書は次のようになります。

{ 
    _id: "yBonLeLPTcffxJwY9", 
    endDate: "someDate", 
    name: "Foo", 
    options: [ 
     { 
     name: "bar", 
     voted: 1, 
     usersId: ["yBonLeLPTczzaJwY9"] 
     } 
    ] 
} 

そして、私の更新要求は次のようになります。私はいくつかのフォーラムで見つける

MongoError: The field 'options.1' must be an array but is of type Object in document {_id: "yBonLeLPTcffxJwY9"}

:私は、このエラーメッセージが表示されました

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$': {usersId: userId}} 
    }); 

位置演算子の使用と増加する値に影響するminimongoには制限があります。

答えて

0

エラーが正しいことを伝えました。あなたはプレーンなメンバーではなく "ドキュメント"を含んでいます。だから、構文は少し異なります。

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$.usersId': userId} 
    }); 

ですから、$pushとに追加する配列への「ドット表記」に完全に内側のフィールドを参照します。それによってエラーが解決されます。

は、私はまた、「投票」システムでは、あなたが代わりにチェックする必要があることを示唆していることが最初のエントリのためのusersId配列:

Votes.update({ 
     _id: mongoId, 
     'options.name': voteName, 
     'options.usersId': { '$ne': userId } 
    }, { 
     $inc: {'options.$.voted': 1}, 
     $push: {'options.$.usersId': userId} 
    }); 

投票した人が投票を送信したときに増加していない、あなたの$incその方法再び配列に追加されることはありません。

関連する問題