mongoose MongoDB错误:无法在架构中找到路径

moiiocjp  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(146)

我有一个方法setFirstNotDoneWordDefinitionToDone,它得到参数id: mongoose.Types.ObjectIdmodelDefinition: string
testerRecord.words[0].definitions[0].definition是一个数组,如果它包含modelDefinition,那么testerRecord.words[0].definitions[0].done必须设置为true。

async setFirstNotDoneWordDefinitionToDone(id: TId, modelDefinition: string) {
        await this.db.models.tester.updateOne(
            {
                _id: id,
            },
            {
                $set: {
                    "words.$[word].definitions.$[definition].done": true,
                },
            },
            {
                arrayFilters: [
                    { "word.done": false },
                    { "definition.definition": modelDefinition },
                ],
            }
        );
    }

但它会抛出一个错误**“错误:在架构”**“中找不到路径“words.0.definitions.0.definition”。然而,当我开始使用第二个过滤器时,它工作得很好。举例来说:$set: { words.$[word].definitions: {} }工作正常。
我花了很多时间在这上面,但不知道我做错了什么。
Mongoose 版本:"mongoose": "7.1.1"

TesterDto:

export class TestWordDefinitionDto {
    @Prop()
    definition: string[];
    @Prop()
    done: boolean;
}

export class TestWordDto {
    @Prop()
    term: string;
    @Prop([TestWordDefinitionDto])
    definitions: TestWordDefinitionDto[];
    @Prop()
    done: boolean;
}

export class TesterForCreateDto {
    @Prop({
        required: true,
        type: MongooseSchema.Types.ObjectId,
        ref: UserDto.name,
    })
    userId: TId;
    @Prop([TestWordDto])
    words: TestWordDto[];
}

@Schema({
    collection: "testers",
    timestamps: { createdAt: true, updatedAt: false },
})
export class TesterDto extends TesterForCreateDto {
    _id: TId;
}

Schema仅从TesterDto创建。

来自db的文件:

我会非常感激任何帮助。

j9per5c4

j9per5c41#

发现错误。Schema中出现问题。我不能用@Prop([TestWordDto])方式定义嵌套对象,我应该为TestWordDto创建另一个模式并将其放入Prop中。
固定:

@Schema({ _id: false })
export class TestWordDefinitionDto {
    @Prop()
    definition: string[];
    @Prop()
    done: boolean;
}
const TestWordDefinitionSchema = SchemaFactory.createForClass(
    TestWordDefinitionDto
);

@Schema({ _id: false })
export class TestWordDto {
    @Prop()
    term: string;
    @Prop([TestWordDefinitionSchema])
    definitions: TestWordDefinitionDto[];
    @Prop()
    done: boolean;
}
const TestWordSchema = SchemaFactory.createForClass(TestWordDto);

export class TesterForCreateDto {
    @Prop({
        required: true,
        type: MongooseSchema.Types.ObjectId,
        ref: UserDto.name,
    })
    userId: TId;
    @Prop({ type: [TestWordSchema], default: [] })
    words: TestWordDto[];
}

@Schema({
    collection: "testers",
    timestamps: { createdAt: true, updatedAt: false },
})
export class TesterDto extends TesterForCreateDto {
    _id: TId;
}

相关问题