简体   繁体   中英

Mongoose not generating _id for subdocument

I have a simple schema with an array in there. When I create a new item including items in the mapping array, the items in the mapping array are automatically assigned an _id. However, when I try to add items to the mapping array of an existing item, the new mapping is created with an _id of null . How do I get mongoose to generate this _id for me? I can't find it anywhere in the documentation.

My schema is:

  {
    email: {
      type: String,
      required: true,
      index: true,
    },
    mapping: [
      {
        mapToField: {
          type: String,
          enum: [
            "subject",
            "location",
            "company",
            "hours",
            "rate",
            "startDate",
            "endDate",
          ],
          required: true,
        },
        mapToLabel: {
          type: String,
          required: true,
        },
        regex: {
          type: String,
          required: true,
        },
      },
    ],
  },
  { timestamps: true }
);

I have tried two ways to add an item to the mapping array but both options result in an item being added without an _id.

Option 1:

    let item = await Mappings.findOne({ _id: id });
    return await item.mapping.create(mapping);

Option 2:

    return await Mappings.update(
      { _id: id },
      { $push: { mapping } },
      { upsert: true }
    );

How do I get mongoose to generate an _id for the items in the mapping array?

Try defining mapping as an schema in your User schema file.

const mappingSchema = new mongoose.Schema({
        mapToField: {
          type: String,
          enum: [
            "subject",
            "location",
            "company",
            "hours",
            "rate",
            "startDate",
            "endDate",
          ],
          required: true,
        },
        mapToLabel: {
          type: String,
          required: true,
        },
        regex: {
          type: String,
          required: true,
        }
})

And then your main schema becomes

{
  email: {
    type: String,
    required: true,
    index: true
  },
  mappings: [mappingSchema]
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM