Sails.js / Waterline:如何在查询查询中使用集合属性?

时间:2015-12-06 22:13:34

标签: node.js sails.js waterline

我正在处理一个Waterline查询,它通过集合属性过滤对象。在此简化示例中,我有两个模型,VideoCategory

// Video.js

module.exports = {

attributes: {
    title: {
      type: 'string'
    },
    categories: {
      collection: 'Category',
      via: 'videos'
    }
  }
};


// Category.js

module.exports = {

  attributes: {
    name: {
      type: 'string'
    },
    videos: {
      collection: 'Video',
      via 'categories'
    }
  }
};

我想查找与某个类别相关联的所有视频。我将类别ID存储在名为categoryID的变量中,并尝试此查询:

Video.find('categories': categoryID).exec(function (err, videos) {
    // videos should contain all videos associated with the categoryID
});

然而,即使有与我正在寻找的类别相关的视频,我总是得到一个空的结果。我知道水线当前不支持对集合属性中的值进行深度查询,但我认为至少对该对象的id的查询是可行的。我错了吗?

如果是这样,是否有其他方法可以在不使用本机查询的情况下实现所需的结果?

我知道我可以向Category添加一个集合属性,并从Category方面构建我的查询。但是,这只是一个更复杂的搜索的开始,我还使用存储在Video对象中的其他属性(例如视频创建者的用户ID)缩小结果范围。最后,我使用分页迭代视频结果。所以我正在寻找一种方法来检索某些类别的视频,这些视频可以与存储在Video对象中的其他搜索属性结合使用。

2 个答案:

答案 0 :(得分:1)

视频模型:

  module.exports = {
    attributes: {
     name: {
            type: 'string'
     },
     categories: {
            collection: 'category',
             via: 'videos'
     },
      toJSON: function() {
           var obj = this.toObject();
           return obj;
      }
   }
};

类别模型:

module.exports = {

    attributes: {
          name: {
               type: 'string'
          },
   videos: {
       collection: 'Video',
       via: 'categories'
   }
}
 };

您的查询将如下所示:

 var arr = ['56667a2cbaea1fcd11c54851','56667b1053c6c37a1283ea75'];

 Video.find().populate("categories",{id:arr}).exec(function(e, r) {
        res.json(r);    
})

答案 1 :(得分:0)

Category.js修改为:

module.exports = {

  attributes: {
    name: {
      type: 'string'
    },
    videos: {
      collection: 'Video',
      via: 'categories'
    }
  }
};

修改Video.js

module.exports = {

  attributes: {
    title: {
      type: 'string'
    },
    categories: {
      collection: 'Category',
      via: 'videos'
    }
  }
};

添加视频时

var title = req.param('title');
var categories = req.param('categories').split(','); //ids of categories in format 1,3,8 etc
Video.create({name: title, categories: categories}, function(err, succ){
    if(err){
        return res.serverError(err);
    }else {
        return res.json(200, succ);
    }       
});

要查找具有特定类别的所有视频,请使用水线中的populate()帮助程序。

var categoryId = req.param('catId');
Category.find({id: categoryId}).populate('videos').exec(function(err, results){
    if(err){
        return res.serverError(err);
    }else {
        return res.json(200, results);
    }
});