首页 > 解决方案 > 我想在猫鼬中使用 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\""*

提前致谢...

标签: node.jsmongodbmongoose

解决方案


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 })

推荐阅读