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

39

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

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

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

正如您所看到的,我只是试图构建一个简单的书签工具。每个用户都有一个名称和一组链接。每个链接都有一个名称和一个URL。

现在,我想做的是例如,在某人的链接数组中查看链接是否已经存在。我希望能够像这样做(尝试获取弗拉德的链接集合,然后查看查询链接是否已经属于集合):

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个回答

79

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

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

要查找属于用户"vlad"的链接,您可以编写

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

这样就可以了。


4
为什么返回的参数是foundLinks而不是foundUsers - geevee
你能回复 @geevee 的评论吗? - Rémi Becheras
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - RameshVel
我非常希望能够看到这两个查询的mongodb原生驱动程序版本。 - scaryguy
4
谢谢您的回答,但是那些查询返回的是用户而不仅仅是像 @vlad 所要求的链接。有没有一种方法只检索链接? - jmcollin92
显示剩余3条评论

3
要查找特定用户所属的特定链接,可以按照以下步骤操作:
User.find({name:'vlad','links.url':req.params.query}, { 'links.$': 1 },  function(err, foundUsers){
      // ---
   });

{ 'links.$' : 1 } 这部分叫什么?我正在寻找有关此功能的文档。我猜它是在说只返回一个嵌套文档? - ram
此外,const foundLinks = foundUsers.links[0] - ViaxCo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接