web-dev-qa-db-fra.com

Interrogatoire de documents imbriqués à l'aide de Mongoose (MongoDB)

Je commence avec mongodb et j'ai du mal à essayer d'interroger des documents imbriqués. J'ai deux schémas:

var LinkSchema = new mongoose.Schema({
    url: String,
    name: String
});

var UserSchema = new mongoose.Schema({
    name: String,
    links: [LinkSchema]
});

Comme vous pouvez le constater, je suis en train de créer un outil de création de signets simple. Chaque utilisateur a un nom et une collection de liens. Chaque lien a un nom et une URL. 

Maintenant, ce que j'essaie de faire, c'est par exemple de voir si un lien existe déjà dans le tableau de liens de quelqu'un. Je voudrais pouvoir faire quelque chose comme ceci (essayer d'obtenir la collection de liens de vlad et ensuite voir si le lien de requête appartient déjà à la collection ou non):

app.get("/:query", function(req, res){
  User.findOne({"name":"vlad"}, function(err, user){
    user.links.find({"url":req.params.query}, function(err, foundLinks){
      if(foundLinks){
        res.send("link already exists!");
      } else {
        res.send("link doesn't exist!");
      }
    });
  });
});

Bien sûr, ce code ne fonctionne pas, car apparemment je ne peux pas faire de "user.links.find ()". Je suppose que je peux simplement faire un user.links.map pour extraire uniquement les URL, puis exécuter une requête d'appartenance sur elle. Mais je pense que cela serait loin de la bonne solution. Il doit y avoir un moyen de faire quelque chose comme ça en utilisant des requêtes DB. Quelqu'un peut aider? Je vous remercie!

27
Vlad

Vous pouvez interroger un document incorporé en mangouste comme ceci

   User.find({'links.url':req.params.query}, function(err, foundUsers){
      // ---
   });

et pour trouver les liens qui appartiennent à l'utilisateur "vlad", vous pouvez écrire

   User.find({name:'vlad','links.url':req.params.query}, function(err, foundUsers){
      // ---
   });

Ça fera l'affaire.

58
RameshVel

Pour trouver un lien spécifique appartenant à un utilisateur spécifique, vous pouvez le faire

User.find({name:'vlad','links.url':req.params.query}, { 'links.$': 1 },  function(err, foundUsers){
      // ---
   });
0
Sritam