【问题标题】:Mongoose - when use populate no records otherwise array of recordsMongoose - 使用时不填充记录,否则为记录数组
【发布时间】:2015-10-18 17:24:38
【问题描述】:

我正在学习 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);

【问题讨论】:

  • 您能否发布基于这些模式声明模型对象的行?

标签: javascript mongodb mongoose mongodb-query mongoose-populate


【解决方案1】:

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.

【讨论】:

    【解决方案2】:

    似乎问题出在创建函数上。我改变了一些东西,它开始工作了:

    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,它也不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2017-11-16
      • 2022-08-18
      • 2020-10-11
      相关资源
      最近更新 更多