为什么新添加的 schema 属性会反映在返回的 mongodb 文档上?

问题描述 投票:0回答:1

我知道在我们的 mongoose schema 中添加新属性不会反映到 mongodb 文档中的现有数据,除非你这样做

db.collection.update(...)

但是为什么 mongoose 在你查询后添加这个新属性呢?

路线处理程序:

// base url endpoit /api/users
// router.get("/", getAllUsers)
async function getAllUsers(req, res) {
  const users = await User.find({})
  res.status(StatusCodes.OK).json({
    success: true,
    data: {
      users: users
    }
  })
}

添加新属性

isAdmin

const userSchema = mongoose.Schema({
  ...
  ...
  password: {
    type: String,
    required: true
  },
  isAdmin: {
    type: Boolean,
    required: true,
    default: false
  }
}, { timestamps: true })

当我查询/获取它们时: enter image description here

编辑:

为什么猫鼬在收到查询文档后插入

isAdmin
?它应该从我们的实际数据库返回确切的
Binary jSON
而不修改它,这样我们就知道我们忘记更新现有文档,因为假设将来我们进入 mongodb 并尝试基于该属性查询文档,例如
 db.users.find({ isAdmin: false })
,没有
isAdmin
属性的文档将始终被排除,除非您使用
null
undefined

node.js mongodb mongoose
1个回答
0
投票

Mongoose 不处理 BSON,它使用 Javascript。

当你执行

await User.find({})
时:

  • mongoose 在 javascript 中构建一个查找命令对象
  • 底层node.js驱动程序将javascript命令对象转换为BSON
  • 驱动程序向服务器发送命令,并接收 BSON 格式的响应
  • 驱动程序将 BSON 响应转换为 JavaScript 对象,并将其返回给 mongoose
  • mongoose 用类似于
    new User(returned value)
  • 的东西实例化一个对象

如果

User
的定义发生更改,即通过修改架构,最后一步中的实例化将使用新定义,因此缺少的 isAdmin 属性将被赋予默认值 false。

© www.soinside.com 2019 - 2024. All rights reserved.