it-swarm.com.de

Drücke Gegenstände in das Mongo-Array über Mungo

Ich habe SO ein gutes Stück nach der Antwort gesucht, aber ich bin mir sicher, dass ich mich nach den richtigen Worten verliere, um zu beschreiben, was ich will.

Grundsätzlich habe ich eine Mongodb-Sammlung namens 'people' Das Schema für diese Sammlung lautet wie folgt: 

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

Jetzt habe ich eine sehr einfache Express-Anwendung, die eine Verbindung zur Datenbank herstellt und erfolgreich "Menschen" mit einem leeren Freunde-Array erstellt.

An einer sekundären Stelle in der Anwendung ist ein Formular vorhanden, um Freunde hinzuzufügen. Das Formular enthält firstName und lastName und dann POSTs mit dem Namensfeld auch als Referenz auf das entsprechende Personenobjekt. 

Mir fällt es schwer, ein neues Freundobjekt zu erstellen und es dann in das Freunde-Array zu "schieben".

Ich weiß, wenn ich dies über die Mongo-Konsole mache, verwende ich die Update-Funktion mit $ Push als zweitem Argument nach den Suchkriterien. Ich kann jedoch nicht den richtigen Weg finden, um Mungos dazu zu bringen.

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

UPDATE: Die Antwort von Adrian war also sehr hilfreich. Folgendes habe ich getan, um mein Ziel zu erreichen.

in meiner app.js-Datei stelle ich eine temporäre Route ein

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

wo in meiner users.js-Datei habe ich

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}});
};
81
Neurax

Angenommen, var friend = { firstName: 'Harry', lastName: 'Potter' };

Sie haben zwei Möglichkeiten:

Aktualisieren Sie das Modell im Arbeitsspeicher und speichern Sie (einfaches Javascript-Array.Push):

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

oder

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

Ich versuche immer, die erste Option zu wählen, wenn dies möglich ist, da dies mehr Vorteile des Mungos berücksichtigt (Haken, Validierung usw.). 

Wenn Sie jedoch viele gleichzeitige Schreibvorgänge durchführen, treffen Sie auf die Rennbedingungen, unter denen Sie versehentliche Versionsfehler erhalten, die Sie daran hindern, jedes Mal das gesamte Modell zu ersetzen und den zuvor hinzugefügten Freund zu verlieren. Gehen Sie also nur dann zu Letzterem, wenn es absolut notwendig ist.

141

Der Operator $ Push hängt einen angegebenen Wert an ein Array an.

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

$ Push fügt das Arrayfeld mit dem Wert als Element hinzu.

Die obige Antwort erfüllt alle Anforderungen, aber ich habe sie mit den folgenden Schritten zum Laufen gebracht

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);
        }
    });
)
13
Parth Raval

Verwenden Sie $Push, um das Dokument zu aktualisieren und einen neuen Wert in ein Array einzufügen.

finden:

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

Ergebnis:

{
    "_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
}

Update:

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

Ergebnis:

{
    "_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
}
0
KARTHIKEYAN.A

Eine einfache Möglichkeit, dies zu tun, besteht darin, Folgendes zu verwenden:

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