我试图在另一个集合中填充某个集合。但是,如果没有在populate方法中指定model,它就不会替换为实际文档。
- cabinet.schema.ts*
import {Prop, Schema, SchemaFactory} from '@nestjs/mongoose';
import { Date, HydratedDocument, Model, Schema as MongooseSchema } from 'mongoose';
export type CabinetDocument = HydratedDocument<Cabinet>;
export const CabinetProjection = {
_id: false,
__v: false,
}
@Schema()
export class Cabinet {
@Prop({
required: true,
unique: true
})
id: string;
@Prop()
items: [{
item: { type: MongooseSchema.Types.ObjectId, ref: "Item" },
status: string;
amount: number;
}];
}
export const CabinetSchema = SchemaFactory.createForClass(Cabinet)
字符串
- item.schema.ts*
import {Prop, Schema, SchemaFactory} from '@nestjs/mongoose';
import mongoose, { HydratedDocument } from 'mongoose';
export type ItemDocument = HydratedDocument<Item>;
export const ItemProjection = {
_id: false,
__v: false,
}
@Schema()
export class Item {
@Prop({
required: true,
unique: true
})
qId: string;
@Prop()
name: string;
@Prop()
description: string;
}
export const ItemSchema = SchemaFactory.createForClass(Item)
型
- cabinet.service.ts*
import { Injectable } from '@nestjs/common';
import { CreateCabinetDto } from './dto/create-cabinet.dto';
import { UpdateCabinetDto } from './dto/update-cabinet.dto';
import { Cabinet, CabinetProjection, CabinetSchema } from './schemas/cabinet.schema';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
@Injectable()
export class CabinetService {
constructor(@InjectModel(Cabinet.name) private cabinetModel: Model<Cabinet>) {}
async findOne(id: string): Promise<Cabinet> {
const result = this.cabinetModel.findOne({
id: id,
}, CabinetProjection).populate({path: "items.item", model: "Item"}).exec();
return result;
}
}
型
在这个设置下,它工作得很好,但是如果我删除model: "Item"
,而不是填充Item文档,我看到的是对象引用。ref: "Item"
参数不够吗?
我的收藏名称也是橱柜和物品。
- 编辑:**
显然问题出在Cabinet的类结构上。如果我修改下面的代码,它就可以在没有模型参数的情况下工作了。如果有任何解释,我将不胜感激。
@Schema()
export class Cabinet {
@Prop({
required: true,
unique: true
})
id: string;
@Prop({ type: [CabinetItem] })
items: CabinetItem[];
}
@Schema()
export class CabinetItem{
@Prop({ type: MongooseSchema.Types.ObjectId, ref: Item.name })
item: Item,
@Prop()
status: string;
@Prop()
amount: number;
}
型
1条答案
按热度按时间z8dt9xmd1#
当我和开发人员一起使用mongoose时,这是最大的困惑之一。希望这能解释。
当我在schema属性上设置
ref
时,我需要指定我希望mongoose使用的模型来执行populate
,并将所有ObjectId
替换为引用集合中的实际文档。下面是一个简单的用户听歌曲的例子:
型
型
1.当我尝试
populate
时,所有的User.songs
mongoose将首先查看populate
方法的options对象中的model
参数。如果没有,则将使用模式中的ref
值来查找要使用的模型。型
mongoose.connection.models
中查找Song
模型,现在可以使用它来执行populate
。在后台,它使用称为modelNamesFromRefPath
和getModelsMapForPopulate
的函数。1.这里的关键是连接。不同的连接可以注册不同的模型。为了让上面的
populate
工作,User
和Song
模型都需要在同一个连接上注册。在我的例子中,我使用了默认的mongoose.connect
连接,所以我的两个模型都注册在mongoose.connection.models
上。然而,有些库使用mongoose.createConnection
,并在一个连接上注册一个模型,在另一个连接上注册另一个模型。在这种情况下,您必须将实际模型而不仅仅是模型名称作为参数传递给populate
,如下所示:型
所以为了回答你的问题“* ref:“Item”参数不够吗?*",是的,这是足够的,通常情况下,可能是在运行
populate
时,Item
模型不在该类的范围内,或者是Nest.js
库需要模型名称作为其自身模型的一部分。你应该尝试将item.schema
导入到cabinet.schema
中,看看是否还需要在populate
中显式地声明Item
。