mongoose findById 返回 null 并且 id 作为对象 id 存储在数据库中

Posted

技术标签:

【中文标题】mongoose findById 返回 null 并且 id 作为对象 id 存储在数据库中【英文标题】:mongoose findById returns null and the id was stored as an object id in the db 【发布时间】:2020-11-19 02:56:01 【问题描述】:

这是我的架构,我没有定义 _id 字段,所以它是由 mongoose 创建的,它的类型是 ObjectId,这就是它在 robo3T 中的显示方式

/*  
  Copyright (c) 2020 Antonio Roldan 
  All rights reserved 
*/


import mongoose,  Schema  from 'mongoose'
import  IAlbum  from '../interfaces/IAlbum'

const albumSchema = new Schema(
  title: 
    type: String,
    required: true,
    minlength: 1,
    trim: true
  ,
  authorId:  // We create an array to allow collaborations
    type: mongoose.Schema.Types.ObjectId
  ,
  authorName: 
    type: String
  ,
  coverUrl:  // Reference to album's image file stored in a gridFS collection
    type: String
  ,
  genres: [
    type: String,
    required: true,
    trim: true
  ],
  releaseDate: 
    type: Date,
    default: Date.now
  ,
  isPremium: 
    type: Boolean,
    default: false
  
)

export default mongoose.model < IAlbum > ('Album', albumSchema)

这里是我进行调用的地方,注意我传递的是字符串而不是 ObjectId,我尝试使用 objectId 但它仍然不起作用

public getAlbumTracks(albumId: string): Promise<any> 
        //TODO: Test this 
    return new Promise(async (resolve, reject) => 
      try
        let albumData: any =  // album: title: , author:, cover: , tracks: [title: , audio: ]
        const albumDocument = await this.albumModel.findById(albumId)
        console.log('albumDocument :', albumDocument)
        const author = await this.userModel.findById(albumDocument.authorId)
        const albumTracks = await this.trackModel.find(album: albumDocument._id)
        albumData.tracks = albumTracks.map(track => 
          return title: track.title, audio: track.trackUrl, isPremium: track.isPremium
        )
        albumData.album = title: albumDocument.title, author: author.username, cover: albumDocument.coverUrl
        resolve(albumData)
       catch(err) 
        reject(code: 500, msg: err.message || err.msg)
      
    )
  

【问题讨论】:

在需要 mongoose 之后添加这一行。 mongoose.set('debug', true);这将打印下一行触发的实际 mongo 查询。常量专辑文档 = 等待 this.albumModel.findById(albumId);共享被触发的查询。它将有助于调试。 【参考方案1】:

您需要将输入 id(字符串)转换为 ObjectID,方法是将其作为 ObjectId 函数的参数进行解析。 这是一个带有猫鼬的示例。

    var mongoose = require('mongoose'); 
    var id = mongoose.Types.ObjectId(stringId);

然后您可以继续在findById(id) 中使用id

【讨论】:

以上是关于mongoose findById 返回 null 并且 id 作为对象 id 存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

更新 findOne()/find()/findById() 返回的文档 - mongoose

更新 findOne()/find()/findById() 返回的文档 - mongoose

Mongoose 中的 Model.findById() - 异步/等待 [重复]

MongoDB findOneAndUpdate 返回 null

MongoDB findOneAndUpdate 返回 null

Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中