基本的に、スキーマが次のとおりである「people」という MongoDB コレクションがあります。
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
これで、データベースに接続し、空の friends 配列を持つ「people」を正常に作成する、非常に基本的な Express アプリケーションができました。
アプリケーションの 2 番目の場所には、友達を追加するためのフォームがあります。フォームは firstName と lastName を受け取り、適切な people オブジェクトを参照するために、name フィールドも POST します。
私が苦労しているのは、新しい友達オブジェクトを作成し、それを友達配列に「プッシュ」することです。
mongo コンソール経由でこれを行う場合、検索条件の後の 2 番目の引数として更新関数を使用することはわかっています$push
が、mongoose でこれを実行するための適切な方法が見つからないようです。
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
ベストアンサー1
仮定すると、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 が提供する利点 (フック、検証など) をより多く活用できるためです。
ただし、同時書き込みを大量に行うと、競合状態に陥り、毎回モデル全体を置き換えることができなくなり、以前に追加したフレンドが失われるという厄介なバージョン エラーが発生します。そのため、後者は絶対に必要な場合にのみ使用してください。