通过mongoose和nestjs中的嵌套对象进行查询

vc6uscn9  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(254)

嵌套在Product文档中的Label文档。
现在,我试图找到所有的文件,其中标签有一些名称,但不是数组的对象,这个数组是空的。
我使用什么来获取文档

return this.productModel.find({
      'label.name': 'Something',
    });

LabelSchema.ts

@Schema({ versionKey: false, timestamps: true })
export class Label extends Document {
  @Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true })
  user: User;

  @Prop({ type: String, required: true })
  name: string;

  @Prop({ type: String, default: null })
  email: string | null;

  @Prop({ type: String, default: null })
  description: string;

  @Prop({ type: SocialSchema, default: new Social() })
  socials: Social;

  @Prop({ type: String, enum: LabelStatus, default: LabelStatus.Draft })
  status: string;

  // TODO add FILE document
  @Prop({ type: String, default: null })
  avatar: any;

  // TODO add FILE document
  @Prop({ type: String, default: null })
  header: any;

  @Prop({
    type: Number,
    default: process.env.APP_DEFAULT_COMMISSION_RATE,
  })
  commissionRate: number;

  @Prop({ type: Number, default: 0 })
  earnings: number;

  @Prop({ type: String, required: true })
  slug: string;

  @Prop({ type: Date, required: true })
  createdAt: Date;

  @Prop({ type: Date, required: true })
  updatedAt: Date;
}

ProductSchema.ts

@Schema({
  versionKey: false,
  timestamps: true,
})
export class Product extends Document {
  @Prop({ type: String, required: true })
  name: string;

  @Prop({ type: String, enum: ProductStatus, default: ProductStatus.Draft })
  status: string;

  @Prop({
    type: mongoose.Schema.Types.ObjectId,
    ref: Label.name,
    autopopulate: true,
  })
  label: Label;

  @Prop({ type: String, default: '' })
  shortDescription: string;

  @Prop({ type: String, default: '' })
  description: string;

  @Prop({ type: Number, default: null })
  price: number | null;

  @Prop({ type: Number, default: null })
  salePrice: number | null;

  @Prop({ type: Boolean, default: false })
  isFree: boolean;

  //TODO add FILE document
  artwork: any;

  //TODO add FILE document
  audioPreview: any;

  @Prop([
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: Category.name,
      autopopulate: true,
    },
  ])
  category: Category[];

  @Prop({ type: Boolean, default: false })
  featured: false;

  @Prop({ type: String, required: true })
  slug: string;

  @Prop({ type: Date, required: true })
  createdAt: Date;

  @Prop({ type: Date, required: true })
  updatedAt: Date;
}
nzkunb0c

nzkunb0c1#

这是因为您的标签在产品模型上是ObjectId,所以您只能按ObjectId查询它。有几种方法可以解决这个问题。最理想的方法是直接按ObjectId查找,而不是按名称查找(例如,如果这是来自客户端的,并且他们正在选择标签,则让客户端发送标签ID,而不是标签名称)。
如果这是不可能的,我建议首先查找标签。

const label = await labelModel.findOne({name: 'Something'}, {_id: 1})
const products = await productModel.find({label: label._id})

相关问题