javascript - español - Cómo definir atributos variables para un sistema de producto en mangosta(node.js)
mongoose tutorial español (3)
Estoy construyendo una aplicación de tienda personal donde los usuarios pueden vender artículos entre ellos, pero me está resultando difícil descifrar cómo administrar los productos. Por ejemplo, si quieres vender una camiseta, deberías poder escoger un tamaño y color, etc. pero si vendes una computadora, debes especificar el año, la potencia de la CPU, etc. Todos los productos tienen título, precio, imágenes y, por lo tanto, en adelante, pero ¿cómo te irías con los diferentes atributos? Estoy usando mongodb para los objetos.
Estaba pensando en tener un campo de attributes
que debería ser un objeto con los diferentes detalles, y luego tener un type
campo que definiría qué propiedades existen. Si type = ''Computer
entonces sabría que los attributes
verían más o menos así.
attributes: {
capacity: 1000 // gb
ram: 4096 // MB
}
etc.
En un diseño orientado a objetos normal lo hubiera hecho a través de herencia / interfaces. Si tiene alguna idea sobre el mejor enfoque para esto en mongoose / node.js, me gustaría saberlo.
Si no me aclaro la pregunta, dígame qué es vago y qué debe aclararse
Editar:
El siguiente artículo describe una solución al problema http://learnmongodbthehardway.com/schema/chapter8/
Sin embargo, no indica dónde colocar los atributos. Una solución podría ser simplemente almacenarla en la categoría misma, pero no estoy seguro acerca de las mejores prácticas aquí.
Para este escenario de datos dinámicos, preferiría mantener los atributos como objeto vacío en el Modelo Mongoose , de modo que pueda usar atributos variables para cada documento.
Modelo
var mongoose = require(''mongoose'');
Schema = mongoose.Schema;
var productSchema = new mongoose.Schema({
title:{type:String,required}, // Common Attributes
price:{type:Number,required}, // Common Attributes
images:[buffer], // Common Attributes
//Other Common Attributes goes here
attributes:{} // Empty attributes object which can vary for each product.
});
var Product = mongoose.model(''Product'', productSchema);
Puede usar el objeto de atributos para especificar los atributos variables para el producto específico.
Controlador
var computer = new Product({
title: ''Computer'',
price: 1000,
attributes:{
year:2000,
cpu:''test'',
power:''75 RMS''
// Other Attributes goes here.
}
});
var shirt = new Product({
title: ''T-Shirt'',
price: 999,
attributes:{
size:30,
color:''black''
// Other Attributes goes here.
}
});
Referencia :
http://mongoosejs.com/docs/schematypes.html (busque el tipo de datos mixtos)
Nota :
Hay otras maneras de crear este esquema, una forma es tener atributos como documento incrustado con todas las combinaciones de atributos y puede mantener el valor como nulo si no es aplicable.
Espero que esto ayude.
Si lo que estás preguntando es cómo abordar el esquema, diría que tu modelo atribuye una matriz de objetos o de tipo mixto
http://mongoosejs.com/docs/schematypes.html
Como puede tener muchas opciones posibles para los atributos, es imposible conocerlos todos por adelantado. Tal vez desee que el usuario defina el nombre del atributo (la clave) y el valor también. Luego, una vez que obtienes un objeto, puedes usar un bucle for in
para usar la clave como la etiqueta y el valor.
ejemplo:
var attributes = [];
for ( attr in item.attributes ) {
//do something with the key=>value pair
attributes.push({
label: attr,
value: item.attributes[attr]
});
}
//iterate through the new array to display your item attributes
Una forma fácil de agregar herencia a sus Esquemas Mongoose es usar discriminadores . Esto le permitirá crear un esquema principal que pueda almacenar atributos que se encuentren en todos sus productos, como título, precio e imágenes. A continuación, puede crear Esquemas secundarios que contendrán atributos específicos de un tipo de producto, como Electrónica y Ropa. Por ejemplo, en el esquema de electrónica puede agregar atributos para cpu y ram que no estarán presentes en el esquema de ropa.
Aquí hay un ejemplo básico de cómo configuré esto usando Node y Mongoose.
Nodo / Javascript
var mongoose = require(''mongoose'');
mongoose.connect(''mongodb://localhost/test'');
// When you create a Electronic Product, it will set the type to Eletronic.
var options = { discriminatorKey: ''type'' };
// parent Product schema.
var productSchema = new mongoose.Schema({ name: String, price: Number }, options);
var Product = mongoose.model(''Product'', productSchema);
// child Electronic schema.
var ElectronicProduct = Product.discriminator(''Electronic'', new mongoose.Schema({ cpu: Number }, options));
var computer = new ElectronicProduct({ name: ''computer'', price: 100, cpu: 5 });
computer.save();
// child Clothing schema.
var ClothingProduct = Product.discriminator(''Clothing'', new mongoose.Schema({ size: String }, options));
var shirt = new ClothingProduct({ name: ''shirt'', price: 50, size: ''Small'' });
shirt.save();
Si registra los objetos que se guardan, deberían verse como
{ _id: 564b55983e5eec1ce2a44038,
type: ''Electronic'',
cpu: 5,
price: 100,
name: ''computer'' }
{ _id: 564b55983e5eec1ce2a44039,
type: ''Clothing'',
size: ''Small'',
price: 50,
name: ''shirt'' }
Cuando intente acceder a atributos que no están en el esquema del Producto, sería una buena práctica verificar si el atributo existe antes de intentar acceder a él.