Comment puis-je remplir des "composants" dans le document d'exemple:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
C'est mon JS où j'obtiens le document de Mongoose:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
j'obtiens la même chose que celle indiquée dans le document d'exemple. Rien n'est changé.Réponses:
Mongoose 4.5 prend en charge cela
Et vous pouvez rejoindre plus d'un niveau profond
la source
pages.$.page.component
ne l' est paspages.$.component
. Comment sait-il apparaître dans l'objet de page?Ça marche pour moi:
Documentation: Model.populate
la source
Comme d'autres l'ont noté,
Mongoose 4
soutient cela. Il est très important de noter que vous pouvez également revenir à plus d'un niveau, si nécessaire, bien que cela ne soit pas indiqué dans la documentation:la source
Vous pouvez remplir plusieurs documents imbriqués comme celui-ci.
la source
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
C'est la meilleure solution:
la source
page
a d'autres propriétés non remplissables.J'ai trouvé cela très utile en créant un feathersjs avant le crochet pour peupler une relation profonde de niveau 2 ref. Les modèles mangouste ont simplement
puis dans feathersjs avant crochet:
Si simple par rapport à d'autres méthodes, j'essayais d'y parvenir.
la source
J'ai trouvé cette question à travers une autre question qui était spécifique à KeystoneJS mais qui a été marquée comme dupliquée. Si quelqu'un ici cherche une réponse Keystone, voici comment j'ai fait ma requête de remplissage profond dans Keystone.
Population à deux niveaux de Mongoose utilisant KeystoneJs [duplicate]
la source
Vous pouvez le faire en utilisant
$lookup
agrégation et probablement la meilleure façon de peupler est de disparaître du mongola source
Mongoose 5.4 prend en charge cela
la source
Pour quelqu'un qui a un problème avec
populate
et qui souhaite également le faire:clients
,users
,rooms
,messasges
.refPath
ou référence dynamiquepopulate
avecpath
etmodel
optionsfindOneAndReplace
/replaceOne
avec$exists
LE CONTEXTE
Objectif
clients
,users
&bot
.clients
ouusers
avec ses modèles Mongoose. Les modèles de client de type _sender sontclients
, pour l'utilisateurusers
.Schéma de message :
SOLUTION
Ma demande d'API côté serveur
Mon code
Fonction utilitaire (sur
chatUtils.js
fichier) pour obtenir le type de message que vous souhaitez enregistrer:Mon côté serveur (en utilisant Nodejs) pour obtenir la demande d'enregistrement du message:
CONSEILS :
Pour la base de données:
refPath
, nous utilisons l'utilitairegetSenderModel
utilisé surpopulate()
. C'est à cause du bot. Lesender.type
peut être:users
avec sa base de données,clients
avec sa base de données etbot
sans base de données. LesrefPath
besoins vraie référence de modèle, sinon, Mongooose jette une erreur.sender._id
peut être de typeObjectId
pour les utilisateurs et les clients, ounull
pour le bot.Pour la logique de demande d'API:
quickReply
message (Message DB doit avoir une seule réponse rapide, mais autant de messages texte simples que vous le souhaitez). Nous utilisons lefindOneAndUpdate
au lieu dereplaceOne
oufindOneAndReplace
.findOneAndUpdate
) et l'populate
opération avec lecallback
de chacun. Ceci est important si vous ne savez pas si l' utilisationasync/await
,then()
,exec()
oucallback(err, document)
. Pour plus d'informations, consultez le document Populate Doc .overwrite
option et sans$set
opérateur de requête.upsert
option.findOneAndUpdate
et pour lepopulate()
.populate
, nous créons une référence de modèle dynamique personnalisée avec legetSenderModel
. Nous pouvons utiliser la référence dynamique Mongoose car lesender.type
forbot
n'a pas de modèle Mongoose. Nous utilisons une base de données peuplée avecmodel
etpath
optins.J'ai passé beaucoup d'heures à résoudre de petits problèmes ici et là et j'espère que cela aidera quelqu'un! 😃
la source
J'ai lutté avec ça pendant une journée sanglante. Aucune des solutions ci-dessus n'a fonctionné. La seule chose qui a fonctionné dans mon cas pour un exemple comme celui-ci:
est de faire ce qui suit: (En supposant que le remplissage après fetch - mais fonctionne également lors de l'appel de populate à partir de la classe Model (suivi de exec))
En d'autres termes, la propriété de chemin la plus externe doit contenir le chemin complet. Aucun chemin partiellement complet couplé à des propriétés de peuplement ne semblait fonctionner (et la propriété de modèle ne semble pas nécessaire; elle a du sens puisqu'elle est incluse dans le schéma). Il m'a fallu une putain de journée pour comprendre ça! Je ne sais pas pourquoi les autres exemples ne fonctionnent pas.
(Utilisation de Mongoose 5.5.32)
la source
Supprimer la référence aux documents
Cela a fonctionné pour moi.
la source