在 Nest JS 中,我无法更新 mongo 集合中的文档。可能是架构实现中的问题。帮我调试一下

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

我有一个

credentials.schema.ts
文件,我在其中定义了凭据集合的架构。凭证文档创建得很好,我可以检索和删除它们。但是,在进行更新查询时,它总是返回
{acknowledged: false}
。我尝试在 mongo 控制台中运行相同的更新查询。它在那里工作。

为什么更新操作失败?

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

// oauth2.schema.ts
@Schema({ _id: false })
class Oauth2Creds {
  @Prop({ type: String, required: false })
  access_token?: string;
  @Prop({ type: String, required: false })
  refresh_token?: string;
}
const CredentialsSchema = SchemaFactory.createForClass(Oauth2Creds);


@Schema()
export class Oauth2 extends Document {
  @Prop({ type: CredentialsSchema, required: true })
  creds: Oauth2Creds;
}
export const Oauth2Schema = SchemaFactory.createForClass(Oauth2);

// simple.schema.ts

@Schema({ _id: false })
export class Simple {
  @Prop()
  secret: string;
}
export const CredentialSchema = SchemaFactory.createForClass(Simple);


@Schema()
export class SimpleCreds {
  @Prop({ type: CredentialSchema })
  creds: Simple;
}
export const SimpleCredsSchema = SchemaFactory.createForClass(SimpleCreds);


// credentials.schema.ts

@Schema({ collection: 'credentials', discriminatorKey: 'kind' })
export class Credentials {
  @Prop({
    type: String,
    required: true,
    enum: [Oauth2.name, SimpleCreds.name],
  })
  kind: string;

  @Prop({ type: String, required: false })
  type?: string;
}
// mongoCredentias.service.ts
@Injectable()
export class MongoCredentialsService {
  constructor(
    @InjectModel(Credentials.name)
    private readonly credentialsModel: Model<Credentials>,
  ) {}
  ...
  ... this.credentialsModel.updateMany({_id: ObjectId("***")}, { $set : { key:val } })
}

**注意:**我正在使用 NEST JS,它内置于 @nestjs/mongoose 库中。我已附上该架构的代码。 说明 - 我有一个

credentials.schema.ts
,其中描述了凭证集合的架构。
oauth2.schema.ts
simple.schema.ts
是包含微分器类型类的两个文件。

typescript mongodb mongoose nestjs nest
1个回答
0
投票

如果需要通过

_id
更新,可以使用功能
findByIdAndUpdate()
功能。

由于只能有 1 个具有特定

_id
的 mongodb 文档,因此尝试使用
updateMany
毫无意义。您可以将文档中想要更新的所有键组合到一个
findByIdAndUpdate()
调用中。

this.credentialsModel.findByIdAndUpdate(ObjectId("***"), { [key]: val })

有关如何使用的更多详细信息,请参阅 https://mongoosejs.com/docs/api/model.html#Model.findByIdAndUpdate()

    

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