J'ai parcouru un bon bout de temps à la recherche de la réponse, mais je suis sûr que je suis perdu pour les bons mots pour décrire ce que je recherche.
Fondamentalement, 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 POSTs avec le champ de nom également pour faire référence à l'objet de personnes approprié.
Ce que j'ai du mal à faire, c'est de créer un nouvel objet ami et de le «pousser» dans le tableau des amis.
Je sais que lorsque je fais cela via la console mongo, j'utilise la fonction de mise à jour avec $ push comme deuxième argument après les critères de recherche, mais je n'arrive pas à trouver le moyen approprié pour que la mangouste fasse cela.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
MISE À JOUR: Donc, 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}});
};
Réponses:
En supposant,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Deux options s'offrent à vous:
Mettez à jour le modèle en mémoire et enregistrez (plain javascript array.push):
ou
J'essaie toujours de choisir la première option lorsque cela est possible, car elle respectera davantage les avantages que la mangouste vous offre (crochets, validation, etc.).
Cependant, si vous effectuez beaucoup d'écritures simultanées, vous rencontrerez des conditions de course où vous vous retrouverez avec de vilaines erreurs de version pour vous empêcher de remplacer le modèle entier à chaque fois et de perdre l'ami précédent que vous avez ajouté. Alors n'allez au premier que lorsque c'est absolument nécessaire.
la source
update
fonction mangouste , alors qu'il n'est PAS sûr de trouver un document, de le modifier en mémoire, puis d'appeler la.save()
méthode sur le document. Quand je dis qu'une opération est «sûre», cela signifie que même si un, deux ou 50 changements sont appliqués à un document, ils seront tous appliqués avec succès et le comportement des mises à jour sera comme prévu. La manipulation en mémoire est essentiellement dangereuse car vous pourriez travailler sur un document obsolète. Ainsi, lorsque vous enregistrez, les modifications survenues après l'étape de récupération sont perdues.let done = function(err, result) { // this runs after the mongoose operation }
La réponse ci-dessus remplit toutes les conditions, mais je l'ai fait fonctionner en procédant comme suit
la source
Utilisez
$push
pour mettre à jour le document et insérer une nouvelle valeur dans un tableau.trouver:
résultat pour trouver:
mettre à jour:
résultat pour la mise à jour:
la source
Un moyen simple de le faire est d'utiliser les éléments suivants:
la source
Dans mon cas, j'ai fait ça
la source
J'ai également rencontré ce problème. Ma solution consistait à créer un schéma enfant. Voir ci-dessous pour un exemple de vos modèles.
---- Modèle de personne
*** Important: SingleFriend.schema -> assurez-vous d'utiliser des minuscules pour le schéma
--- Schéma enfant
la source