Mongoose - 使用时不填充记录,否则记录数组

Mongoose - when use populate no records otherwise array of records

我正在学习 MeanJS,但我对 Mongoose 有疑问。我有两个型号:

var CategorySchema = new Schema({
    name: {
        type: String,
        default: '',
        required: 'Please fill Category name',
        trim: true
    },
    slug: {
        type: String,
        default: '',
        trim: true,
        unique: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    articles: [{
        type: Schema.ObjectId,
        ref: 'Article'
    }]
});

var ArticleSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    category: {
        type: Schema.ObjectId,
        ref: 'Category'
    },
    title: {
        type: String,
        default: '',
        trim: true,
        required: 'Title cannot be blank'
    },
    slug: {
        type: String,
        default: '',
        trim: true,
        unique: true
    },
    content: {
        type: String,
        default: '',
        trim: true
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

我正在保存这样的文章:

exports.create = function(req, res) {
    var article = new Article(req.body);
    article.user = req.user;

    article.save(function(err) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            Category.findById(article.category).exec(function(err, category) {
                category.articles.push(article.category);
                category.save(function(err, category) {
                    if (err) {
                        return res.status(400).send({
                            message: errorHandler.getErrorMessage(err)
                        });
                    } else {
                        res.json(article);
                    }
                });
            });

        }
    });
};

并且保存正常。对象看起来像这样:

{
    "_id" : ObjectId("55b73bf97aa70c2c083655b0"),
    "user" : ObjectId("55b115f35c7a03cc0e59d821"),
    "articles" : [ 
        ObjectId("55b73c017aa70c2c083655b2"), 
        ObjectId("55b73ee20bab5e8c0c7eadca")
    ],
    "created" : ISODate("2015-07-28T08:23:21.562Z"),
    "slug" : "motocycles",
    "name" : "Motocycles",
    "__v" : 2
}

甚至当我计算像 {{ category.articles.length }} 这样的记录时,它在类别中的文章数量是适当的,我什至可以在视图中打印 ObjectId。但是当我像这样添加 .populate('articles') 时:

exports.list = function(req, res) {
    Category.find().sort('-created').populate('user', 'displayName').populate('articles').exec(function(err, categories) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.jsonp(categories);
        }
    });
};

长度returns 0,ObjectIds 消失了,我无法访问文章属性,就像类别中没有文章一样。知道为什么会这样吗?

补充编辑:

mongoose.model('Article', ArticleSchema);
mongoose.model('Category', CategorySchema);

看来问题出在创建函数上。我做了一些更改,它开始工作了:

exports.create = function(req, res) {
  var article = new Article(req.body);
  article.user = req.user;

  article.save(function(err, savedArticle) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      Category.findById(article.category).exec(function (err, category) {
        category.articles.push(savedArticle);
        category.markModified('articles');

        category.save(function (err, category) {
          if (err) {
            return res.status(400).send({
              message: errorHandler.getErrorMessage(err)
            });
          } else {
            res.json(savedArticle);
          }
        });
      });
    }
  });
};

我很好奇为什么即使 Category 对象具有正确的 Article ObjectId,它也无法正常工作。

First, some changes with regard to variables,schema instances and using ObjectId(The mongoose documentation isn't the best).

var categorySchema = new mongoose.Schema({
    name: {
        type: String,
        required: 'Please fill Category name',
        trim: true
    },
    slug: {
        type: String,
        trim: true,
        unique: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: mongoose.Types.Schema.ObjectId,
        ref: 'User'
    },
    articles: [{
        type: mongoose.Types.Schema.ObjectId,
        ref: 'Article'
    }]
});

var articleSchema = new mongoose.Schema({
    created: {
        type: Date,
        default: Date.now
    },
    category: {
        type: mongoose.Types.Schema.ObjectId,
        ref: 'Category'
    },
    title: {
        type: String,
        trim: true,
        required: 'Title cannot be blank'
    },
    slug: {
        type: String,
        trim: true,
        unique: true
    },
    content: {
        type: String,
        trim: true
    },
    user: {
        type: mongoose.Types.Schema.ObjectId,
        ref: 'User'
    }
});

You need to export your models if you are using an MV* pattern with separate files for separate concerns. So...

exports.method = mongoose.model('Category',categorySchema);
exports.otherMethod = mongoose.model('Article',articleSchema);

. method and .otherMethod are from nodejs. Not sure about express equivalent or what express itself uses.

Then just name this file and require it using its path.