node.js - 我想在猫鼬中使用 findById 查询(Ref ObjectId)查询所有文档
问题描述
目前正在构建笔记应用程序项目,我们可以在其中保存笔记,也可以编辑和删除笔记..突然卡在这里......我想查询(findById)所有与用户ID匹配的文档..在这种情况下我引用了用户在 Notes Schema中发布的id ..
这是我的用户 schmea 或模型...
import mongoose from 'mongoose'
const userSchema = new mongoose.Schema({
username: {
type: String,
required: [true, 'please provide username'],
},
email: {
type: String,
required: [true, 'please provide email'],
unique: true,
index: true,
},
password: {
type: String,
required: [true, 'please provide password'],
},
accountCreatedAt: {
type: String,
default: Date,
},
})
const User = mongoose.model('User', userSchema)
export default User
这是我的笔记架构,我将用户 ID 引用为 ref :
import mongoose from 'mongoose'
const noteSchema = new mongoose.Schema(
{
title: {
type: String,
required: [true, 'please provide title'],
unique: true,
trim: true,
},
text: {
type: String,
trim: true,
required: [true, 'Please provide text'],
},
lable: {
type: String,
required: [true, 'please provide lable'],
},
postedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
},
},
{
timestamps: { createdAt: 'created_At', updatedAt: 'updated_At' },
}
)
const Note = mongoose.model('Note', noteSchema)
export default Note
路由和控制器功能:
noteRoutes.get('/getNotesByUserID/:_id', noteController.getNotesByUserID)
export const getNotesByUserID = async (req, res, next) => {
try {
const id = req.params._id
const userNotes = await Note.findById({ postedBy: id })
res.status(200).json({
status: 'success',
data: {
userNotes,
},
})
} catch (error) {
res.status(400).json({
status: 'error',
data: {
message: error.message,
},
})
}
}
当我尝试在邮递员中对此进行测试时,我收到以下消息:
*"message": "Cast to ObjectId failed for value \"{ postedBy: '609554f9560327264b23d3fe' }\" at path \"_id\" for model \"Note\""*
提前致谢...
解决方案
mongoose
findById方法将id
参数转换为模型_id
字段的类型,在您的情况下,此字段是 ObjectID 类型。
但是,您将id
参数作为对象传递,{ postedBy: '609554f9560327264b23d3fe' }
然后mongoose
尝试执行以下操作:
const castId = new ObjectId({ postedBy: '609554f9560327264b23d3fe' })
由于明显的原因,这失败了。
因为findById
是一种通过字段“快速”查找文档的自定义方法,所以_id
您不应该使用它来查询不同的字段。在您的演员阵容中,您应该findOne
改用。
const userNotes = await Note.findOne({ postedBy: id })
推荐阅读
- angular - Angular 6 视图未更新,即使使用 ChangeDetectorRef、ngZone 和 requestAnimationFrame
- variables - Lua:检查局部或全局变量
- runtime-error - 无法获取管理权限。运行时错误:无法执行命令 chcp
- ruby-on-rails - 下划线在 ruby on rails 中的 axlsx 中不起作用
- python - 如何将 MultiIndex 数据框列与简单数据框匹配并相乘?
- javascript - NodeJS res.on() 没有被触发。res.on() 不是函数
- android - 如何从 SQLite 存储和检索最近 30 天的数据?
- modeling - 中国古典政治秩序愿景的程序建模
- javascript - 使用 ecmascript 6 将 javascript 文件导入另一个文件的语法是什么?
- javascript - typescript 文件在哪里以及如何成为我项目中的 JS 文件?