Mongoose - 当使用时填充没有记录,否则记录数组

时间:2015-07-28 08:49:06

标签: 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}}这样的记录时,它在类别中是适当数量的文章,我甚至可以在视图中打印ObjectIds。但是当我像这样添加.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,ObjectIds消失,我无法访问文章属性,就像没有类别的文章一样。任何想法为什么会发生这种情况?

其他编辑:

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

2 个答案:

答案 0 :(得分:0)

似乎问题出在create function上。我改变了一些东西,开始工作了:

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。

答案 1 :(得分:0)



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.