7
votes

Utilisez la requête de mangouste pour obtenir seulement un subdocument

J'ai une source de données similaire à celle-ci:

GrandParentModel.findOne(
    {
        "id" : 0,
        "children.id" : 0,
        "children.children.id" : 0,
        "children.children.children.id" : 0,
        "children.children.children.children.id" : 0
    },
    {"children.children.children.children.$" : 1}, callback);


0 commentaires

3 Réponses :


2
votes

est très difficile de faire fonctionner ce genre de choses de manière propre.

Je n'ai pas trouvé de solution propre sur ce sujet, mais je peux peut-être vous aider avec la boucle. Vous pouvez éviter la boucle en utilisant: varoc = parent.children.id (id); Recherche d'un sous-document

J'espère que cela vous aidera. Salutations, Sebastian.


1 commentaires

Mais dans ce cas, je reçois d'abord un grand document, puis je sélectionne dans ce document tous les champs dont j'ai besoin. Plutôt, je n'obtiens qu'un peu de sous-documenta. Je pense que le travail avec petit document est plus rapide puis travaille avec Big Doc.



3
votes

Cela fait quelque temps depuis que j'ai posé cette question, mais je pense avoir trouvé une manière assez élégante de travailler avec ce type de structures.

Dans ce cas, je vais montrer comment il fonctionne avec seulement grand-parent, parent et Enfant. P>

au lieu de stocker une liste de sous-documents dans chaque document (grand-parent.children, parent.children), j'ai créé un identifiant unique de la structure suivante: p> xxx pré >

Ceci crée une hiérarchie de grands-parents> Parent> Enfant. P>

Les modèles seraient comme suit: P>

// First find all children which belong to the grandparent
Child.find({"id.grandparent" : "some key to the grandparent"})
.exec(function(err, children)
{
     if(err)
         return;

     Parent.find({"id.grandparent" : "some key to the grandparent"})
     .exec(function(err, parents)
     {
         if(err)
             return;

         // Loop through the parents and children to connect them before returning to a client
         for(var i = 0; i < parents.length; i++)
         {
             var parent = parents[i];
             parent.children = [];
             // loop through the children to check if they belong to the current parent
             for(var j = 0; j < children.length; j++)
             {
                 var child = children[j];
                 if(parent.id.parent == child.id.parent)
                     parent.children.push(child);
             }
         }

         // After filling the children into the parents, get the grandparents and do the same for the parents and grandparents as done for the children and parents.
        GrandParent.find({"id.grandparent" : "some key to the grandparent"})
       .exec(function(err, grandparents)
       {
           // TODO: the same as done above (two loops, one loops the grandparents, other loops the parents
           // Once this is finished, we have a filled grandparent
       });

     });
});


1 commentaires

Quelques vidéos pertinentes sur YouTube, une sur "Le principe de la moins cardinalité" et l'autre Un avec un exemple sur stocker des données hiérarchiques . Ceci est à partir d'un parcours lié à la mangouste sur edx appelé "" Introduction à MongoDB en utilisant la pile moyenne "



1
votes

Ceci a fonctionné pour moi xxx

$ elemmatch (projection)


0 commentaires