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

标签 javascript mongodb mongoose mongodb-query mongoose-populate

我正在学习 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}} 这样的记录时,类别中的文章数量也是适当的,我什至可以在 View 中打印 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);
        }
    });
};

长度返回 0,ObjectId 消失,我无法访问文章属性,就像类别中没有文章一样。知道为什么会发生这种情况吗?

附加编辑:

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。

关于javascript - Mongoose - 使用时不填充任何记录,否则填充记录数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31671504/

相关文章:

node.js - 显示mongodb中字段值部分匹配的文档

javascript - $locationProvider.html5Mode(true) 不适用于 tomcat

javascript - 单击 P5.JS 中的 Triangle 项目允许单击三 Angular 形修复之外

widget - UserVoice 等托管服务如何将其内容嵌入其他网站?

java - 在微服务架构中管理与 MongoDb 的关系

php - 具有匹配和范围的redis数据存储

mongodb - 在带有 MongoDB 的 Spring Boot M7 中找不到 ReflectKotlinClass

javascript - 当 Mongodb 未运行时,Mongoose.connect 不会抛出任何错误

node.js - Mongoose 找不到刚刚保存的数据

javascript - 为什么要使用这个对象创建实践?