提问者:小点点

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


我开始使用mongodb,在尝试查询嵌套文档时遇到了困难。 我有两个模式:

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

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

正如你所看到的,我只是搭售建立一个简单的书签工具。 每个用户都有一个名称和一个链接集合。 每个链接都有一个名称和一个URL。

现在,我尝试做的是,例如,看看某人的links数组中是否已经存在一个链接。 我希望能够做这样的事情(尝试获取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!");
      }
    });
  });
});

当然,这段代码不起作用,因为显然我不能做一个“user.links.find()”。 我想我可以做一个user.links.map来只提取URL,然后对它运行成员资格查询。 但我认为这远远不是正确的解决办法。 一定有一种方法可以在本地使用DB查询来做类似的事情。 有人能帮忙吗? 谢谢!


共2个答案

匿名用户

您可以在mongoose中查询嵌入式文档,如下所示

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

要找到属于用户“vlad”的链接,可以编写

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

这个就行了。

匿名用户

要查找属于特定用户的特定链接,可以执行以下操作

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