web-dev-qa-db-ja.com

mongooseを介してmongo配列にアイテムをプッシュする

私はSOで答えを探していましたが、自分がしていることを説明するのに適切な語句が見つからないと確信しています。

基本的に私は 'people'というmongodbコレクションを持っています。そのコレクションのスキーマは以下の通りです:

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

これで、データベースに接続し、空の友達配列を持つ「人」を正常に作成する、非常に基本的なエクスプレスアプリケーションができました。

アプリケーションの2番目の場所では、友達を追加するためのフォームが用意されています。このフォームはfirstNameとlastNameを取り込んでから、適切なpeopleオブジェクトを参照するためにnameフィールドをPOSTします。

私が苦労しているのは、新しいフレンドオブジェクトを作成し、それをフレンド配列に「プッシュ」することです。

私がmongoコンソールでこれをするとき、私はルックアップ基準の後に$ Pushを2番目の引数として使ってupdate関数を使うことを知っていますが、mongooseにこれをさせるための適切な方法を見つけることができないようです。

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

UPDATE:だから、エイドリアンの答えはとても役に立ちました。以下は私の目標を達成するために私がしたことです。

私のapp.jsファイルで、私はを使用して一時的なルートを設定します

app.get('/addfriend', users.addFriend);

私のusers.jsファイルのどこに私は

exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$Push: {friends: friend}});
};
113
Neurax

var friend = { firstName: 'Harry', lastName: 'Potter' };と仮定

2つの選択肢があります。

モデルをメモリ内で更新し、保存します(plain javascript array.Push)。

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

または

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

それはmongooseがあなたに与えるより多くの利点(フック、検証など)を尊重するので、可能な限り私は常に最初のオプションを試してみます。

ただし、多数の同時書き込みを行っている場合は、毎回モデル全体を置き換えて前に追加した友人を失うことを防ぐために、厄介なバージョンエラーが発生するという競合状態に遭遇します。それが絶対に必要なときにだけ前者に行ってください。

168

$ Push 演算子は、指定された値を配列に追加します。

{ $Push: { <field1>: <value1>, ... } }

$ Push は、値を要素として持つ配列フィールドを追加します。

上記の答えはすべての要件を満たしていますが、私はそれを次のようにしてうまくいっています

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $Push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });
)
22
Parth Raval

$Pushを使用して文書を更新し、配列内に新しい値を挿入します。

検索:

db.getCollection('noti').find({})

検索の結果

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

更新:

db.getCollection('noti').findOneAndUpdate(
   { _id: ObjectId("5bc061f05a4c0511a9252e88") }, 
   { $Push: { 
             graph: {
               "date" : ISODate("2018-10-24T08:55:13.331Z"),
               "count" : 3.0
               }  
           } 
   })

更新結果:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}
4
KARTHIKEYAN.A

そのための簡単な方法は、以下を使用することです。

var John = people.findOne({name: "John"});
John.friends.Push({firstName: "Harry", lastName: "Potter"});
John.save();
0
Felipe Toledo