查询API如何获取第三级路径的所有数据?

时间:2015-04-24 18:39:44

标签: node.js api mongoose

这是我现有的架构:

var Schema = mongoose.Schema;

    var ProviderSchema = new Schema({
        name: String,
        abbreviated: String,
        services: Array,
        locations: Array,
        description: String,
        url: String,
        upvotes:{type:Number, default:0},
        createdOn: { type: Date, default: Date.now},
        posts:[{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }]
    });

这是帖子架构:

var PostSchema = new mongoose.Schema({
     title: String,
     body: String,
     upvotes: {type: Number, default:0},
     author: String,
     provider: { type: mongoose.Schema.Types.ObjectId, ref: 'Provider' },
     comments:[{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
 });

我之前填写了帖子:

router.get('/providers/:provider', function(req, res) {
    req.provider.populate('posts', function(err, provider) {
        res.json(provider);
    });
});

这就是我在API中所拥有的:

router.get('/providers/:provider/posts', function(req, res) {
    Post.find(function(err, post){
        if(err){ return next(err); }
        res.json(post);
    });
});

我想在API中编写查询,查询一个提供程序的所有帖子。这个router.get无法正常工作并给我错误答案。如果有人可以帮我改变这个查询来纠正错误。我将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据您的架构和路由,我假设您有一个名为Provider的模型,它使用显示的模式,并且URL中的:provider是请求的提供者的ID。如果是这样,您可以使用findById。此外,由于您使用的是引用数组,因此如果您需要除ID以外的任何内容,则需要populate

router.get('/providers/:provider/posts', function(req, res) {
  Provider.findById(req.params.provider).select('posts').populate('posts').exec(function(err, provider) {
    if(err){ return next(err); }
    res.json(provider.posts);
  });
});

否则,如果您尝试使用Post模型,则需要显示该模式。

更新:使用您的Post型号:

router.get('/providers/:provider/posts', function(req, res) {
  Post.find({provider: req.params.provider}, function(err, posts) {
    if(err){ return next(err); }
    res.json(posts);
  });
});