MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose trouver/mettre à jour le sous-document

Donc, comme vous le notez, la valeur par défaut dans la mangouste est que lorsque vous "intégrez" des données dans un tableau comme celui-ci, vous obtenez un _id valeur pour chaque entrée de tableau dans le cadre de ses propres propriétés de sous-document. Vous pouvez en fait utiliser cette valeur pour déterminer l'index de l'élément que vous avez l'intention de mettre à jour. La façon MongoDB de faire cela est la position $ variable opérateur, qui contient la position "correspondante" dans le tableau :

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$": permission
        }
    },
    function(err,doc) {

    }
);

Ce .findOneAndUpdate() méthode renverra le document modifié ou sinon vous pouvez simplement utiliser .update() comme méthode si vous n'avez pas besoin que le document soit renvoyé. Les parties principales "correspondent" à l'élément du tableau à mettre à jour et "identifient" cette correspondance avec le $ positionnel comme mentionné précédemment.

Alors bien sûr vous utilisez le $set opérateur de sorte que uniquement les éléments que vous spécifiez sont en fait envoyés "sur le fil" au serveur. Vous pouvez aller plus loin avec la "notation par points" et spécifier simplement les éléments que vous souhaitez réellement mettre à jour. Comme dans :

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$.role": permission.role
        }
    },
    function(err,doc) {

    }
);

C'est donc la flexibilité qu'offre MongoDB, où vous pouvez être très "ciblé" dans la façon dont vous mettez à jour un document.

Cependant, cela "contourne" toute logique que vous pourriez avoir intégrée à votre schéma "mongoose", comme la "validation" ou d'autres "hameçons de pré-sauvegarde". En effet, la méthode "optimale" est une "fonctionnalité" de MongoDB et sa conception. Mongoose lui-même essaie d'être un emballage "de commodité" sur cette logique. Mais si vous êtes prêt à prendre vous-même le contrôle, les mises à jour peuvent être effectuées de la manière la plus optimale.

Donc, dans la mesure du possible, gardez vos données "intégrées" et n'utilisez pas de modèles référencés. Il permet la mise à jour atomique des éléments "parent" et "enfant" dans des mises à jour simples où vous n'avez pas à vous soucier de la simultanéité. C'est probablement l'une des raisons pour lesquelles vous auriez dû choisir MongoDB en premier lieu.