Mangouste trouver/mise à jour le sous-document
J'ai les schémas suivants pour le document Dossier:
var permissionSchema = new Schema({
role: { type: String },
create_folders: { type: Boolean },
create_contents: { type: Boolean }
});
var folderSchema = new Schema({
name: { type: string },
permissions: [ permissionSchema ]
});
Ainsi, pour chaque Page, je peux avoir le nombre d'autorisations. Dans mon CMS il y a un panneau où j'ai la liste de tous les dossiers et leurs autorisations. L'administrateur peut modifier une autorisation unique et de l'enregistrer.
Je pourrais facilement sauvegarder l'ensemble de l' Dossier document avec ses autorisations de tableau, où seule une autorisation a été modifié. Mais je ne veux pas sauver tout le document (le vrai schéma a beaucoup plus de champs) j'ai donc fait ceci:
savePermission: function (folderId, permission, callback) {
Folder.findOne({ _id: folderId }, function (err, data) {
var perm = _.findWhere(data.permissions, { _id: permission._id });
_.extend(perm, permission);
data.markModified("permissions");
data.save(callback);
});
}
mais le problème est que perm est toujours undefined! J'ai essayé de "statiquement" récupération de l'autorisation de cette façon:
var perm = data.permissions[0];
et il fonctionne très bien, le problème est donc de Souligner que la bibliothèque n'est pas en mesure d'interroger les autorisations de tableau. Donc je suppose qu'il y a de mieux (et workgin) pour obtenir le sous-document de récupéré un document.
Une idée?
P. S.: j'ai résolu la vérification de chaque élément dans les données.l'autorisation de tableau à l'aide d'une boucle "for" et de vérification des données.les autorisations[i]._id == autorisation._id mais j'aimerais une solution plus intelligente, je sais qu'il y a un!
Vous devez vous connecter pour publier un commentaire.
Donc, comme vous le notez, la valeur par défaut dans la mangouste est que lorsque vous "intégrer" des données dans un tableau comme cela, vous obtenez un
_id
valeur pour chaque entrée de ce tableau dans le cadre de son propre sous-propriétés du document. Vous pouvez réellement utiliser cette valeur pour déterminer l'index de l'élément dont vous souhaitez mettre à jour. MongoDB façon de le faire est le position$
opérateur variable, qui détient les "matched" position dans le tableau:Que
.findOneAndUpdate()
méthode retourne le document modifié ou sinon, vous pouvez simplement utiliser.update()
comme une méthode si vous n'avez pas besoin du document retourné. Les parties principales sont le "jumelage" de l'élément de la matrice de mise à jour et "identification" qui correspondent à la position$
comme mentionné plus haut.Alors bien sûr, vous êtes à l'aide de la
$set
opérateur afin que seulement les éléments que vous indiquez sont effectivement envoyés "sur le fil" sur le serveur. Vous pouvez aller plus loin avec "pointillé" et il suffit de spécifier les éléments que vous voulez mettre à jour. Comme dans:Donc, c'est la souplesse que MongoDB offre, où vous pouvez être très "ciblé" dans la façon dont vous avez fait la mise à jour d'un document.
Ce que ce fait n'est cependant "bypass" toute logique, vous pourriez avoir intégré dans votre "mangouste" schéma, telles que la "validation" ou autres "pré-enregistrer les crochets". C'est parce que le "optimale" moyen est un MongoDB "fonctionnalité" et la façon dont il est conçu. Mangouste lui-même essaie d'être un "confort" de l'emballage au cours de cette logique. Mais si vous êtes prêt à prendre un certain contrôle de vous-même, alors les mises à jour peuvent être faites dans la manière la plus optimale.
Donc si possible de le faire, de garder vos données "embedded" et de ne pas utiliser les modèles référencés. Il permet la mise à jour atomique à la fois de "parent" et "enfant" éléments de simples mises à jour où vous n'avez pas besoin de vous soucier de la concurrence. Est probablement l'une des raisons pour lesquelles vous devriez avoir sélectionné MongoDB en premier lieu.
_id
propriété de la sous-document MongoDB l'a donné pour être une partie d'un tableau. C'est probablement parce que j'ai enlevé le_id
propriété de passage du facteur du corps de la requête, peut-être que j'ai juste besoin de s'assurer qu'il est dans le corps de la requête? Bizarre que MongoDB est de me laisser complètement remplacer l'ensemble de l'objet, y compris la suppression de la_id
de la propriété. Il ne le fait pas sur les objets parents (en fait un PATCH demande au lieu de la METTRE). Aucune solution de contournement?Afin de valider les sous-documents lors de la mise à jour de la Mangouste, vous avez à la "charge" comme un objet de Schéma, puis Mangouste va automatiquement déclencher la validation et de crochets.
Si vous avez un tableau de sous-documents, vous pouvez extraire souhaitée, l'un avec le
id()
méthode prévue par la Mangouste. Ensuite, vous pouvez mettre à jour ses champs individuellement, ou si vous souhaitez mettre à jour plusieurs champs à la fois, puis utilisez laset()
méthode.Notez que vous n'avez pas vraiment besoin de la
userId
pour trouver à l'Utilisateur un document, vous pouvez l'obtenir par la recherche de celui qui a une adresse de sous-document qui correspond àaddressId
comme suit:Rappelez-vous que dans MongoDB, la sous-document est enregistré seulement lorsque le parent document est enregistré.
Savoir plus sur le sujet sur le la documentation officielle.
Si vous ne voulez pas de collecte sélective, de simplement intégrer la permissionSchema dans le folderSchema.
Si vous avez besoin de séparer les collections, c'est la meilleure approche:
Vous pourriez avoir un modèle d'Autorisation:
Et un Dossier modèle avec une référence à l'autorisation du document.
Vous pouvez faire référence à un autre schéma comme ceci:
Et ensuite appeler
Folder.findOne().populate('permissions')
demander mangouste pour renseigner le champ des autorisations.Maintenant, ce qui suit:
La
perm
champ ne sera pas non défini (si l'autorisation._id est en fait dans les autorisations de tableau), car elle est peuplée par Mangouste.permissionSchema
. Chaque schéma des cartes à une collection de mongodb.