【问题标题】:Are mongoose embedded document objects mongoose objects?猫鼬嵌入文档对象是猫鼬对象吗?
【发布时间】:2012-12-19 17:46:41
【问题描述】:

我有以下代码 sn-ps 在项目中嵌入了注释

var CommentModel = new Schema({
  text: {type: String, required: true},
}, {strict: true})

CommentModel.options.toJSON = { transform: function(doc, ret, options){
  delete ret.__v;
  delete ret._id;
}}

Comment = mongoose.model('Comment', CommentModel);

var ItemModel = new Schema({
  name:        {type: String, required: true},
  comments:    [ Comment ]
}, {strict: true})

Item = mongoose.model('Item', ItemModel);

Item.findOne({}, function (err, item) {
  item.comments.forEach(function(o) {
    console.log(o.toJSON)
  })
})

但是,返回的结果对象数组似乎不是猫鼬对象,或者至少没有应用转换。我是否在某处遗漏了某些东西,或者猫鼬不支持这一点?

【问题讨论】:

  • 我认为toJSON 选项是在架构上设置的,而不是在模型上。
  • 这可能是我狡猾的命名约定。它在架构上设置。
  • 哦,是的,呃,我应该仔细看看。

标签: javascript node.js mongoose


【解决方案1】:

你有几个问题:

ItemModel 应该在其架构中引用架构 CommentModel,而不是模型 Comment

var ItemModel = new Schema({
  name:        {type: String, required: true},
  comments:    [ CommentModel ]   // <= Here
}, {strict: true})

您需要在您的console.log 中调用toJSON,而不是将函数作为参数传递:

Item.findOne({}, function (err, item) {
  item.comments.forEach(function(o) {
    console.log(o.toJSON())   // <= Here
  })
})

【讨论】:

  • 是的,这是有道理的(现在适当地重命名了我的对象)。但是我仍然得到“TypeError: Object # has no method 'toJSON'”
  • @Nick 嗯...我确实运行了这段代码并确认它有效。这是 Mongoose 3.5.1 的版本。
  • 啊哈,是的,我的错误 - 我的模型和模式在单独的文件中,我没有导出,所以是的,修复效果很好。谢谢!
  • 我在引用模型时遇到了奇怪的错误,谢谢!
【解决方案2】:

你可以像这样定义一个模式方法:

CommentModel.methods.toJson = { ... };

后期编辑: 我指的是一种方法,而不是选项。您还可以在此方法中过滤某些数据,作为奖励:)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-01-31
  • 2016-11-28
  • 2015-09-06
  • 2014-07-26
  • 2014-07-28
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多