mongodb 使用mongo在nest.js中的数组中嵌套文档的id

tag5nh1u  于 2023-08-04  发布在  Go
关注(0)|答案(3)|浏览(106)

有没有一种方法可以用auto-generated _id在数组中创建每个文档?
我正在尝试这个模型:

// Nested Document
export class Group extends Document {
  @Prop({ required: true, unique: true, auto: true, })
  _id?: Types.ObjectId;

  @Prop({ required: true })
  count?: number;
  ...
}

// Main Document
@Schema()
export class Party extends Document {
  @Prop({ required: true })
  direction: string;

  @Prop({ type: Array<Group>, required: true, _id: true })
  groups: Array<Group>;
  ...
}

export const PartySchema = SchemaFactory.createForClass(Party);

字符串
但是在我的PartyService中,当我创建一个party时,nested _id并没有被创建。例如,如果我运行这个:

create(){
  return await this.model.create({
    direction: "Main st.",
    groups: [
      {
        count: 5
      },
      {
        count: 7
      }
    ]
  });
}


它只是创建一个文档如下:

{
  _id: "a3d768f1..."
  direction: "Main st.",
  groups: [
    {
      count: 5
    },
    {
      count: 7
    }
  ],
  createdAt: ...,
  updatedAt: ...,
  ...,
}

vc6uscn9

vc6uscn91#

在Mongoose中,当您使用模式在数组中定义嵌套文档时,子文档的_id字段不会自动生成。这是因为子文档被认为是嵌入的,而Mongoose默认情况下不会为嵌入的文档生成_id。
为了缓解这一挑战,您需要在保存交易方文档之前手动生成并分配_id

@Injectable()
export class PartyService {
  constructor(@InjectModel(Party.name) private model: Model<Party>) {}

  async create(dir, groups) {
    const party = new this.model({
      direction: dir,
      groups: groups
    });

    // Generate and assign _id for each group
    party.groups.forEach((group) => {
      group._id = Types.ObjectId();
    });

    return await party.save();
  }
}

字符串
作为PartyService.create()的参数的groups值的示例可以是:

const groups = [
  {
    count: 1,
  },
  {
    count: 2,
  },
],

u4vypkhs

u4vypkhs2#

您可能忘记在嵌套的文档部分中添加它,而且您不必从Document扩展。所以extends Document可以跳过
代码如下所示

@Schema({ _id: true })
export class Group {
  @Prop({ required: true, unique: true, auto: true, })
  _id?: Types.ObjectId;

  @Prop({ required: true })
  count?: number;
  ...
}

字符串
如果不需要__vtimestamps,也可以跳过这些,如下所示

{_id: true, timestamps: false, versionKey: false}

ecbunoof

ecbunoof3#

export const ObjectIdType = mongoose.Schema.Types.ObjectId;
@Prop({ required: false, type: ObjectIdType })
_id: string;

字符串
请尝试此代码

相关问题