Qué hace esta herramienta
Una muestra JSON pasa a ser un esquema de Mongoose, un const por objeto, y un modelo al final.
{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import mongoose from 'mongoose';
const AddressSchema = new mongoose.Schema({
city: { type: String, required: true },
});
const RootSchema = new mongoose.Schema({
id: { type: Number, required: true },
name: { type: String, required: true },
address: { type: AddressSchema, required: true },
});
export default mongoose.model('Root', RootSchema);
Los hijos primero: los esquemas son valores de ejecución, uno debe existir antes de que otro lo use. Un array de documentos en la raíz describe su primer elemento: esa es la forma del registro, y la lista ya es lo que la colección es.
required en un array necesita ayuda
Mongoose da a todo array el valor por defecto []. Un campo declarado { type: [String], required: true } valida por tanto incluso sin la clave: el defecto satisface la exigencia. Comprobado en Mongoose 9:
| documento | required: true | required: true, default: undefined |
|---|---|---|
{ tags: ["a"] } | pasa | pasa |
{ tags: [] } | pasa | pasa |
{} | pasa | falla |
La primera columna no dice lo que la palabra promete. Los campos de array se emiten por eso con default: undefined junto a required: true, para que un array ausente sea el error que dice ser. Un array vacío sigue pasando, y es justo: es un valor.
Los objetos anidados pasan a subdocumentos, con su propio _id
address de arriba es un subdocumento, y Mongoose le da un _id propio:
{ _id: ObjectId("…"), address: { city: "Paris", _id: ObjectId("…") } }
Es el comportamiento por defecto de Mongoose, no un añadido de aquí. Si esos identificadores internos te sobran, new mongoose.Schema({ … }, { _id: false }) los quita: una decisión sobre tus documentos, y por eso se te deja a ti.
Un export de MongoDB no es el JSON que quieres
mongoexport escribe JSON extendido:
{ "_id": { "$oid": "65f1c…" }, "created": { "$date": "2026-01-01T00:00:00Z" } }
Son objetos: el generador hace esquemas de subdocumento con ellos, y _id acaba siendo un subdocumento con su propio _id, que desde luego no es lo que querías. Sustitúyelos a mano por mongoose.Schema.Types.ObjectId y Date. Una clave llamada $oid significa algo para MongoDB y nada para un lector de estructuras.
Mixed es donde la muestra se calló
null, un valor desconocido, un array vacío y un array heterogéneo dan todos mongoose.Schema.Types.Mixed. Un campo Mixed no se valida y, conviene saberlo, sus cambios no se siguen automáticamente: hay que llamar a markModified. Estréchalo en cuanto sepas qué debe ir ahí.
Privado por diseño
Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.