1. ホーム
  2. node.js

[解決済み】mongooseでmongoの配列にアイテムをプッシュする。

2022-04-01 11:45:51

質問

基本的に、私は'people'という名前のmongodbのコレクションを持っています。 そのスキーマは次のとおりです。

people: {
         name: String, 
         friends: [{firstName: String, lastName: String}]
        }

さて、データベースに接続し、空の友人配列を持つ 'people' を作成する、非常に基本的な express アプリケーションができました。

アプリケーションの二次的な場所には、友達を追加するためのフォームが設置されています。このフォームにはfirstNameとlastNameが入力され、nameフィールドも適切なpeopleオブジェクトを参照するためにPOSTされます。

私が困っているのは、新しい友人オブジェクトを作成し、それを友人配列に "push"することです。

mongo コンソールでこの操作を行う場合、update 関数に $push を第二引数として渡しますが、mongooseにこれをさせる適切な方法が見つかりません。

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});

解決するには?

想定しています。 var friend = { firstName: 'Harry', lastName: 'Potter' };

選択肢は2つありますね。

モデルをインメモリで更新し、保存する(プレーンなjavascriptのarray.push)。

person.friends.push(friend);
person.save(done);

または

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

私は可能な限り最初の選択肢を選ぶようにしています。なぜなら、その方がmongooseが与えてくれる利点(フック、バリデーションなど)をより多く尊重することができるからです。

しかし、同時にたくさんの書き込みを行う場合、レースコンディションに陥り、毎回モデル全体を置き換えることを阻止するために厄介なバージョンエラーが発生し、前に追加した友人が失われてしまうことになります。ですから、前者にするのは絶対に必要なときだけにしてください。