猫鼬中 ref 集合的默认值

Posted

技术标签:

【中文标题】猫鼬中 ref 集合的默认值【英文标题】:default value for ref collection in mongoose 【发布时间】:2018-12-03 03:09:50 【问题描述】:

我有一个用户个人资料,我有一个“收入”字段,它在架构中看起来像这样

收入: 类型:Schema.Types.ObjectId, 参考:“收入”

创建新用户时如何为收入字段设置默认值?我不能这样做

earning: 
    type: Schema.Types.ObjectId,
    ref: 'Earning',
    default: 0
  

我得到了错误 路径“earning”处值“0”的值“0”转换为 ObjectId 失败

【问题讨论】:

【参考方案1】:

您在这里做错的是尝试在 ID 字段上投射数字。由于它是另一个对象 Id 字段的引用,因此您不能将其设置为 0。您需要做的是在db中创建用户时设置null,并将其初始化为null值。 喜欢:

earning: 
  type: Schema.Types.ObjectId,
  ref: 'Earning',
  default: null

【讨论】:

我猜 you can set 0 to it 应该是 you can not set 0 to it @SergioM。不,你不能,我得到了我测试过的错误。 但我必须在我的 api 中做一些修改?就像收入 = 收入 === null 一样? 0:未定义? 能否详细说明一下?【参考方案2】:

据我了解,earning 表示用户赚了多少,所以它应该是Number 类型而不是ObjectId

所以尝试将您的架构更改为

earning: 
type: Number,
ref: 'Earning',
default: 0

所以你可以使用0

注意:如果您出于某种原因应该使用ObjectId,那么“Haroon Khan”的答案就是正确答案。

【讨论】:

【参考方案3】:

当基于具有“ObjectId”类型键和另一个集合的引用的模式实例化文档时,我发现设置“默认”值的唯一方法是使用 Mongoose 中间件here 描述的架构级别。例如,当作者未登录时,将评论的作者设置为用户集合中的默认“访客”文档可能如下所示:

// user document in MongoDB
  
  _id: ObjectId('9182470ab9va89'),
  name: 'guest'


// CommentSchema
const mongoose = require('mongoose')

const CommentSchema = mongoose.Schema(
  author: 
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
  ,
  body: String
)

CommentSchema.pre('save', function (next) 
  this.author == null ? this.author = '9182470ab9va89' : null
  next()
)

module.exports = mongoose.model('Comment', CommentSchema)

本示例使用 'save' 预挂钩和在架构中硬编码的 ObjectId 用于演示目的,但您可以将 ObjectId 的硬编码替换为对后端的调用,或者您希望在其中获取该值在那里。

【讨论】:

以上是关于猫鼬中 ref 集合的默认值的主要内容,如果未能解决你的问题,请参考以下文章

创建新对象时,猫鼬中的值不会增加

在猫鼬中格式化日期

在猫鼬中使用动态字段

在猫鼬中填充数据无法正常工作?

在猫鼬中匹配具有字符串值的数组?

在猫鼬中匹配具有字符串值的数组?