2012-09-30 15 views
15

Estoy tratando de comenzar a utilizar Mongoose como un ODM para MongoDB con mi aplicación node.js. Me he dado cuenta de que cuando diseño un esquema con un documento incrustado, si no le agrego un valor, almacena una matriz en blanco "[]" en Mongo. ¿Por qué es esto? Intento almacenar cambios históricos en registros y una matriz en blanco significaría que ese cambio eliminó el valor. Aquí hay un esquema de muestra.¿Por qué Mongoose agrega matrices en blanco?

schema.Client = new mongoose.Schema({ 
    name:{type:String, required:true}, 
    products:[{ 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }], 
    subdomain:{type:String, index:{unique:true}}, 
}) 

Aquí está el documento resultante cuando guardo un documento con solo nombre y subdominio.

{ 
    "name": "Smith Company", 
    "products": [], 
    "subdomain": "smith" 
} 

¿Por qué agregó productos con una matriz en blanco por defecto y cómo puedo detenerlo?

+0

el valor por defecto para una matriz es una matriz vacía, así que si guarda solamente {name: "foo", subdominio: "bar"} productos será una matriz vacía – supernova

+0

¿Hay alguna forma de cambiar el valor predeterminado de una matriz para que no escriba nada? – wintzer

+0

puede publicar el código donde actualiza su documento? – supernova

Respuesta

0

Porque en su esquema está definiendo los productos como una matriz de objetos. Debería intentar algo como:

products: { 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }, 

Esto almacenará un objeto vacío en lugar de una matriz.

+2

Quiero que sea una matriz, ya que un documento puede contener referencias a varios productos. No quiero que escriba nada en la base de datos si no incluyo datos. – wintzer

+0

Creo que esto ni siquiera está escrito en la base de datos, ¿lo has marcado? Tenía un modelo sin matriz, y cuando acabo de agregar una matriz de identificadores de objeto y '.findOne '' hizo una de estas instancias de modelo. '.toJSON' agregó la lista vacía en la respuesta, a pesar de que no he escrito en la base de datos desde entonces. – sol

12

La matriz en blanco le brinda la manera conveniente de agregar o quitar elementos de su Modelo.

$push$addToSet$pull en actualización lo ayudaría a administrar sus elementos de matriz.

Si usted no tiene una matriz en blanco, no se puede empujar a los elementos null

pero es posible en conjunto blanco.

+10

Todavía hay casos en los que desearía que la falta de un atributo representara "irrelevante para este documento". Cuando eso es algo común, es una pérdida fea tener un montón de matrices vacías. Parece vencer a una de las bellezas de las bases de datos de documentos, a saber, la capacidad de almacenar diferentes estructuras de documentos en la misma colección. Me gustaría ver que la capacidad de las matrices en blanco no da lugar a ningún atributo en el documento a menos que una matriz en blanco sea parte explícita del modelo que se está guardando. Esto también es intuitivo. Eso o una explicación de por qué no es posible en MongoDB. – neverfox

3

Esto parece ser por diseño, pero hay una solución aquí usando un manejador de 'pre' para eliminar el defecto matriz vacía: https://github.com/LearnBoost/mongoose/issues/1335

Esto sólo funcionó para mí cuando me puse el campo para null, sin embargo. Si lo configuro en undefined como en el código de muestra, la matriz vacía parece regresar.

3

Puede solucionar por definir el esquema, como a continuación:

products: { 
    type: [{ 
    name:String, 
    startDate:Date, 
    endDate:Date 
    }], 
    default: undefined 
} 
Cuestiones relacionadas