如何在mongoose中获取所有嵌套文档对象

时间:2014-04-15 20:48:05

标签: node.js mongodb express mongoose mean-stack

我是mongo DB的新手。我正在使用MEAN堆栈开发应用程序。在我的后端我有两个型号 - 功能和放大器项目。

项目架构有一个名为“features”的属性,它是一个Feature对象数组。

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ProjectSchema = new Schema({
    name: {
        type: String,
        default: '',
        trim: true
    },
    features:{
        type: [Schema.ObjectId],
        ref: 'Feature'  
    }
});

/**
 * Statics
 */
ProjectSchema.statics.load = function(id, cb) {
    this.findOne({
        _id: id
    })
    .populate('features')
    .exec(cb);
};

mongoose.model('Project', ProjectSchema);

请注意,我有功能和项目架构的单独文件。我正在将两个模式注册为mongoose模型。 我还有一个控制器用于导出以下中间件功能的项目:

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Project = mongoose.model('Project'),
    Testcase = mongoose.model('Feature'),
    _ = require('lodash');


/**
 * Find project by id
 */
exports.project = function(req, res, next, id) {
    Project.load(id, function(err, project) {
        if (err) return next(err);
        if (!project) return next(new Error('Failed to load project ' + id));
        console.log(project.features.length);
        req.project = project;
        next();
    });
};

由于我在Project模式的静态加载函数中使用了“.populate('features')”,我原本期望上面的项目对象中的Feature对象的所有细节。但它没有发生,它为features属性返回一个空数组。谁能告诉我,我在这里失踪了什么?

1 个答案:

答案 0 :(得分:2)

  

项目架构有一个名为“features”的属性,它是一个Feature对象数组。

小心。您需要的是一个与Feature文档对应的ObjectIds数组。

我认为你需要像这样指定project.features模式:

features: [{type: Schema.ObjectId, ref: 'Feature'}]

填充函数仅在代码和数据都100%正确并且很容易出错时才有效。您可以发布正在加载的项目文档的示例数据吗?我们需要确保features实际上是一个数组,实际上包含ObjectIds而不是字符串或对象等。