J'ai SO beaucoup cherché la réponse, mais je suis sûr que je suis perdu pour les bons mots décrivant ce que je recherche.
En gros, j'ai une collection mongodb appelée 'people' Le schéma de cette collection est le suivant:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Maintenant, j'ai une application express très basique qui se connecte à la base de données et crée avec succès des «personnes» avec un tableau d'amis vide.
Dans un emplacement secondaire de l'application, un formulaire est en place pour ajouter des amis. Le formulaire prend firstName et lastName, puis POST avec le champ de nom également pour référence à l'objet de personnes approprié.
Ce que j'ai du mal à faire, c'est créer un nouvel objet ami puis le "pousser" dans le tableau des amis.
Je sais que lorsque je le fais via la console Mongo, j'utilise la fonction de mise à jour avec $ Push comme second argument après les critères de recherche, mais je ne semble pas pouvoir trouver le moyen approprié pour obtenir un mangouste.
db.people.update({name: "John"}, {$Push: {friends: {firstName: "Harry", lastName: "Potter"}}});
UPDATE: Ainsi, la réponse d'Adrian a été très utile. Voici ce que j'ai fait pour atteindre mon objectif.
dans mon fichier app.js, j’ai défini un itinéraire temporaire en utilisant
app.get('/addfriend', users.addFriend);
où dans mon fichier users.js j'ai
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}});
};
En supposant, var friend = { firstName: 'Harry', lastName: 'Potter' };
Vous avez deux options:
Mettez à jour le modèle en mémoire, puis enregistrez-le (tableau javascript en clair):
person.friends.Push(friend);
person.save(done);
ou
PersonModel.update(
{ _id: person._id },
{ $Push: { friends: friend } },
done
);
J'essaie toujours de choisir la première option lorsque cela est possible, car elle respectera davantage les avantages que la mangouste vous apporte (crochets, validation, etc.).
Cependant, si vous effectuez de nombreuses écritures simultanées, vous rencontrerez des conditions de concurrence viciées qui vous empêcheront de remplacer le modèle entier à chaque fois et de perdre votre ami précédent. Alors n'allez à ce dernier que lorsque c'est absolument nécessaire.
L'opérateur $ Push ajoute une valeur spécifiée à un tableau.
{ $Push: { <field1>: <value1>, ... } }
$ Push ajoute le champ du tableau avec la valeur comme élément.
La réponse ci-dessus répond à toutes les exigences, mais je l’ai obtenue en procédant comme suit:
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);
}
});
)
Utilisez $Push
pour mettre à jour le document et insérer une nouvelle valeur dans un tableau.
trouver:
db.getCollection('noti').find({})
résultat:
{
"_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
}
mettre à jour:
db.getCollection('noti').findOneAndUpdate(
{ _id: ObjectId("5bc061f05a4c0511a9252e88") },
{ $Push: {
graph: {
"date" : ISODate("2018-10-24T08:55:13.331Z"),
"count" : 3.0
}
}
})
résultat:
{
"_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
}
Un moyen facile de le faire est d'utiliser les éléments suivants:
var John = people.findOne({name: "John"});
John.friends.Push({firstName: "Harry", lastName: "Potter"});
John.save();