使用Mongoose(MongoDB)查询嵌套文档

Vla*_*lad 29 mongoose mongodb node.js

我开始使用mongodb并且很难尝试查询嵌套文档.我有两个模式:

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

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

如您所见,我只是想建立一个简单的书签工具.每个用户都有一个名称和一组链接.每个链接都有一个名称和一个网址.

现在,我要做的是例如,查看某人的链接数组中是否已存在链接.我希望能够做这样的事情(尝试获取vlad的链接集合,然后查看查询链接是否已经属于集合):

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!");
      }
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

当然,这段代码不起作用,因为显然我不能做"user.links.find()".我想我可以只做一个user.links.map来提取网址,然后针对它运行会员资格查询.但我认为这远非正确的解决方案.必须有一种方法可以使用数据库查询本地执行此类操作.有人可以帮忙吗?谢谢!

Ram*_*Vel 63

您可以像这样在mongoose中查询嵌入的文档

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

并找到属于用户"vlad"的链接,你可以写

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

这样就可以了.

  • 为什么返回的参数是`foundLinks`而不是`foundUsers`? (3认同)
  • 感谢您的回答,但是这些查询返回的是Users,而不仅是@vlad要求的链接。有没有一种方法可以使链接无效? (2认同)