gpt4 book ai didi

javascript - Mongoose TypeScript ObjectId 转换 - 类型 'string' 不可分配给类型 'Condition'

转载 作者:行者123 更新时间:2023-12-05 00:27:32 26 4
gpt4 key购买 nike

当我通过 ObjectId 字段进行查询时,我遇到了 mongoose 查询的问题。路过mongoose.Types.ObjectIdstring两者都会引发错误。当我将 ObjectId 转换为 mongoose.Schema.Types.ObjectId 时,TypeScript 才停止提示,然后在运行时崩溃,因为它不是有效的 ObjectId。

interface DocumentWithTimestamp extends Document<ObjectId> {
createdAt: Date;
updatedAt: Date;
}
首先,我注意到 Document 定义了 _idObjectId | undefined ,这已经使一切复杂化了。
我将我的模式定义如下:
export interface LanguageSchema extends DocumentWithTimestamp {
langCode: string;
locale: string;
}


interface LanguageModel extends Model<LanguageSchema> {
mapToLanguage(language: LeanDocument<LanguageSchema> | LanguageSchema): Language;
}

const languageSchema = new Schema<LanguageSchema, LanguageModel>(
{
langCode: { type: String, required: true, trim: true },
locale: { type: String, unique: true, required: true, trim: true },
},
{ collection: 'language', timestamps: true, versionKey: false },
);

languageSchema.statics.mapToLanguage = function (language: LeanDocument<LanguageSchema> | LanguageSchema): Language {
return {
id: language._id?.toString() || '', // why is _id conditional...?
langCode: language.langCode,
locale: language.locale,
};
};

export const LanguageModel = model<LanguageSchema, LanguageModel>('Language', languageSchema);
现在通过 _id 或任何其他 ObjectId 字段查询我的 LanguageModel 会引发类型错误:
export async function findLanguagesByIds(languageIds: string[]) {
return LanguageModel.find({ _id: { $in: languageIds } }).lean();
}
错误:
Argument of type '{ _id: { $in: string[]; }; }' is not assignable to parameter of type 'Callback<LanguageSchema[]>'.
Object literal may only specify known properties, and '_id' does not exist in type 'Callback<LanguageSchema[]>'.
当我尝试将 string[] 转换为 Schema.Types.ObjectId[] 数组时,错误消失了,但这不是解决方案,因为它在运行时崩溃(Schema.Types.ObjectId 不是有效的 ObjectId)。
const languages = await LanguageModel.find({
_id: { $in: languageIds.map((id) => new mongoose.Schema.Types.ObjectId(id)) },
}).lean();
如果我投到 mongoose.Types.ObjectId (对于一个真正的 ObjectId)它再次抛出错误......
任何帮助表示赞赏!

最佳答案

我找到了解决我的问题的方法。
mongoose 文件定义如下:

class Document<T = any, TQueryHelpers = any, DocType = any> {
constructor(doc?: any);

/** This documents _id. */
_id?: T;

// ...
}
我使用 Document<ObjectId> 对其进行了扩展.然而,ObjectId 类型是 Schema 类型,例如
import { ObjectId } from "mongoose";
但它实际上应该是 Mongoose 的实际 ObjectId 类型而不是 Schema 类型!
使固定:
import { Types } from "mongoose"

interface DocumentWithTimestamp extends Document<Types.ObjectId> {
createdAt: Date;
updatedAt: Date;
}

关于javascript - Mongoose TypeScript ObjectId 转换 - 类型 'string' 不可分配给类型 'Condition<ObjectId | undefined>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69412049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com