2012-10-27 164 views
26

我刚开始使用MongoDB并且很难尝试查询嵌套文档。我有两个模式:使用Mongoose查询嵌套文档(MongoDB)

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

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

正如你所看到的,我只是想搭建一个简单的书签工具。每个用户都有一个名称和一组链接。每个链接都有一个名称和一个网址。

现在,我想要做的是,例如,查看某个链接是否已经存在于某人的链接数组中。我希望能够做这样的事情(试图让弗拉德的链接集合,然后查看该查询链接已经属于集合与否):

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来提取只有网址,然后运行一个成员资格查询。但我认为这远非正确的解决方案。有一种方法可以使用数据库查询本地执行此类操作。有人可以帮忙吗?谢谢!

回答

52

可以在猫鼬查询嵌入文档这样

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

,并找到属于用户“弗拉德”的链接,你可以写

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

这将这样的伎俩。

+3

为什么返回的参数是'foundLinks'而不是'foundUsers'? – geevee

+0

你能回答@geevee评论吗? –

+1

@Ré[email protected]它应该是'foundUsers',但我只是使用了OP最初发布的代码..它是'foundLinks'那里..你可以检查:) – RameshVel