【问题标题】:Querying nested documents using Mongoose (MongoDB)使用 Mongoose (MongoDB) 查询嵌套文档
【发布时间】:2012-10-17 07:54:24
【问题描述】:

我开始使用 mongodb 并且很难尝试查询嵌套文档。我有两个架构:

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

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

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

现在,例如,我要做的是查看某人的链接数组中是否已经存在链接。我希望能够做这样的事情(尝试获取 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,然后对它运行成员资格查询。但我认为这远非正确的解决方案。必须有一种方法可以使用数据库查询在本机上做这样的事情。有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

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

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

    这样就可以了。

    【讨论】:

    • 为什么返回的参数是foundLinks而不是foundUsers
    • 你能回复@geevee评论吗?
    • @RémiBecheras @geevee 应该是 foundUsers,但我只是使用了 OP 最初发布的代码.. 那里是 foundLinks.. 你可以检查一下:)
    • 谢谢。我们问是因为如果它是正确的,我们错过了一些重要的东西......我刚刚编辑了你的帖子以修复它
    • 感谢您的回答,但这些查询返回用户,而不仅仅是@vlad 要求的链接。有没有办法只检索链接?
    【解决方案2】:

    要查找属于特定用户的特定链接,您可以这样做

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

    【讨论】:

    • { 'links.$' : 1 } 部分叫什么?我正在寻找有关此功能的文档。我假设它是说只返回一个嵌套文档?
    • 添加到这里,const foundLinks = foundUsers.links[0]
    猜你喜欢
    • 2014-08-05
    • 2012-06-23
    • 2021-02-25
    • 2016-08-16
    • 2015-02-10
    • 2016-05-07
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多