1

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

项目模式有一个名为“特征”的属性,它是一个特征对象的数组。

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);

请注意,我对功能和项目架构有单独的文件。我将两种模式都注册为猫鼬模型。对于导出以下中间件功能的项目,我也有一个控制器:

'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 属性返回一个空数组。谁能告诉我我在这里错过了什么?

4

1 回答 1

2

项目模式有一个名为“特征”的属性,它是一个特征对象的数组。

那里小心。您需要的是与 Feature 文档相对应的 ObjectId 数组。

我认为您需要像这样指定 project.features 架构:

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

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

于 2014-04-16T00:13:32.597 回答