Playground
Api

Conversion Mapping

How Zod types and validations are mapped to Mongoose.

Conversion Mapping

@nullix/zod-mongoose automatically maps Zod's built-in validations and transformations to their corresponding Mongoose SchemaType options.

Automatic Validation Mapping

The following Zod checks are directly converted to Mongoose SchemaType options:

Zod CheckMongoose OptionTarget Types
.min(n)minlength: nz.string()
.max(n)maxlength: nz.string()
.length(n)minlength: n, maxlength: nz.string()
.regex(re)match: rez.string()
.trim()trim: truez.string()
.toLowerCase()lowercase: truez.string()
.toUpperCase()uppercase: truez.string()
.min(n) / .positive()min: nz.number(), z.date()
.max(n) / .negative()max: nz.number(), z.date()
.uuid()type: Schema.Types.UUIDz.string()
.datetime()type: Datez.string()
.date()type: Datez.string()
.time()type: Stringz.string()

Type Conversion Table

The following table shows how Zod types are mapped to Mongoose types by default.

Zod TypeMongoose TypeNotes
z.string()StringRequired by default unless .optional() is used.
z.string().uuid()mongoose.Schema.Types.UUIDMaps to Mongoose's native UUID type.
z.string().datetime()DateMaps to Mongoose Date for automatic parsing and indexing.
z.string().date()DateMaps to Mongoose Date.
z.number()Number
z.boolean()Boolean
z.date()Date
z.bigint()BigIntFallback to Number if BigInt is not supported. Use withMongoose with type: 'Long' for 64-bit integers.
z.enum()StringIncludes Mongoose enum validation.
z.nativeEnum()StringIncludes Mongoose enum validation.
z.string().trim()StringAutomatically sets trim: true.
z.string().toLowerCase()StringAutomatically sets lowercase: true.
z.string().min(5)StringAutomatically sets minlength: 5.
z.array()[]Mapped to a Mongoose array of the inner type.
z.set()[]Mapped to a Mongoose array of the value type.
z.tuple()[]Mapped to a Mongoose array of the first item's type.
z.record()MapMapped to a Mongoose Map with of type.
z.map()MapMapped to a Mongoose Map with of type.
z.object()Nested ObjectMapped to a nested Mongoose schema or subdocument.
z.intersection()Nested ObjectMerges the definitions of both branches into a single object.
z.union()Schema.Types.Union (primitives) or Nested Object (objects)Mapped to Union for primitives, merged into an object for z.object() unions. Others fallback to Mixed.
z.xor()mongoose.Schema.Types.MixedNon-inclusive union. Maps to Mixed with a custom Zod-based validator to enforce mutual exclusivity.
z.discriminatedUnion()Mongoose DiscriminatorMaps to native Mongoose discriminators. Common fields are automatically moved to the base schema.
zObjectId()mongoose.Schema.Types.ObjectIdSpecialized helper for ObjectIds. By default, it is omitted from the generated Mongoose schema to let Mongoose handle its auto-generation.
zBuffer()mongoose.Schema.Types.BufferSpecialized helper for Buffers.
zPopulated()mongoose.Schema.Types.ObjectIdHelper for fields that can be either an ObjectId or a populated object.
z.instanceof(Buffer)mongoose.Schema.Types.Buffer
z.instanceof(ObjectId)mongoose.Schema.Types.ObjectId
z.literal()String / Number / BooleanMapped to the literal's type with a Mongoose enum constraint.
z.any() / z.unknown()mongoose.Schema.Types.MixedFallback for unhandled types.

Unhandled and Unsupported Zod Types

The following Zod types are currently not explicitly handled or are unsupported by nature and will fall back to Mongoose.Schema.Types.Mixed unless a custom type is provided via withMongoose.

Zod TypeCurrent StatusRecommended Alternative
z.readonly()Base TypeAutomatically unwrapped, applies readOnly: true metadata.
z.promise()UnsupportedNot applicable for database schemas
z.function()UnsupportedNot applicable for database schemas
z.void() / z.never()Unsupported

Note: Types like z.branded(), z.readonly(), z.pipeline(), z.preprocess(), and z.transform() are automatically unwrapped to their underlying base type during conversion.