2015-11-13 2 views
8

Ich baue eine Personal Shop App, wo Benutzer Artikel verkaufen können, aber ich habe eine schwierige Zeit herauszufinden, wie man das verwaltet Produkte. Zum Beispiel, wenn Sie ein T-Shirt verkaufen möchten, sollten Sie in der Lage sein, eine Größe und Farbe usw. zu wählen, aber wenn Sie einen Computer verkaufen, sollten Sie das Jahr angeben, CPU-Leistung usw. Alle Produkte haben einen Titel, Preis, Bilder und so weiter, aber wie würdest du mit den unterschiedlichen Attributen auskommen? Ich benutze mongodb für die Objekte.So definieren Sie unterschiedliche Attribute für ein Produktsystem in mongoose (node.js)

Ich dachte über ein Feld attributes, die ein Objekt mit den verschiedenen Details sein sollte, und dann ein Feld type, die definieren würde, welche Eigenschaften vorhanden sind. Wenn type = 'Computer dann würde ich wissen, dass attributes in etwa so aussehen würde.

attributes: { 
    capacity: 1000 // gb 
    ram: 4096 // MB 
} 

usw.

In einem normalen objektorientierten Design würde ich dies über Schnittstellen Vererbung/getan haben. Wenn Sie eine Idee über den besten Ansatz dafür in mongoose/node.js haben, würde ich mich freuen, davon zu hören.

Wenn ich mich nicht klar in der Frage machen Sie mir sagen, was vage ist und was sollte geklärt werden

Edit:

Der folgende Artikel beschreibt eine Lösung für das Problem http://learnmongodbthehardway.com/schema/chapter8/

Es gibt jedoch nicht an, wo die Attribute zu setzen sind. Eine Lösung könnte darin bestehen, sie einfach in der Kategorie selbst zu speichern, aber ich bin mir hier nicht sicher, was die besten Praktiken sind.

+0

Fragen Sie, wie man das Schema definiert oder wie man sich der Sache im Allgemeinen nähert? –

+0

Möglich durch 'discriminator mapping' https://github.com/Automatic/mongoose/pull/1647 und dies wurde hier in SO diskutiert. – jpaljasma

+0

Am Anfang wäre ein guter Kick in die richtige Richtung sinnvoll. In Bezug auf die Definition des Schemas ist auch nützlich zu wissen, aber das kann ich auf – chrs

Antwort

8

Eine einfache Möglichkeit, Erbe zu Ihrem Mongoose Schemen hinzuzufügen ist Discriminators zu verwenden. Auf diese Weise können Sie ein übergeordnetes Schema erstellen, in dem Attribute für alle Ihre Produkte wie Titel, Preis und Bilder gespeichert werden können. Sie können dann untergeordnete Schemas erstellen, die Attribute enthalten, die für einen Produkttyp wie Elektronik und Kleidung spezifisch sind. Zum Beispiel können Sie im Elektronikschema Attribute für CPU und RAM hinzufügen, die im Kleidungsschema nicht vorhanden sind.

Hier ist ein grundlegendes Beispiel, wie ich dies mit Knoten und Mongoose einrichten.

Node/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(); 

Wenn Sie die Objekte protokollieren, die gespeichert werden sie wie

{ _id: 564b55983e5eec1ce2a44038, 
    type: 'Electronic', 
    cpu: 5, 
    price: 100, 
    name: 'computer' } 
{ _id: 564b55983e5eec1ce2a44039, 
    type: 'Clothing', 
    size: 'Small', 
    price: 50, 
    name: 'shirt' } 

aussehen sollte Wenn Sie versuchen, den Zugriff auf Attribute, die nicht im Produkt Schema sind, es Es wäre ratsam, vor dem Zugriff darauf zu prüfen, ob das Attribut existiert.

3

Wenn das, was Sie fragen, wie das Schema zu nähern ich Ihr Modell machen würde sagen Attribute ein Array von Objekten oder des Typs gemischte

http://mongoosejs.com/docs/schematypes.html

Weil Sie es viele mögliche Optionen für Attribute haben kann unmöglich um alle im Voraus zu kennen. Vielleicht möchten Sie, dass der Benutzer den Namen des Attributs (den Schlüssel) und auch den Wert definiert. Sobald Sie ein Objekt erhalten haben, können Sie eine for in-Schleife verwenden, um den Schlüssel als Bezeichnung und Wert zu verwenden.

Beispiel:

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 
1

Für dieses dynamische Datenszenario würde ich lieber Attribute als leeres Objekt im Mongoose Model behalten, so dass Sie für jedes Dokument verschiedene Attribute verwenden können.

Modell

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); 

Sie können die Attribute-Objekt verwenden, um die unterschiedlichen Attribute für das jeweilige Produkt angeben.

-Controller

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. 
} 
}); 

Referenz:

http://mongoosejs.com/docs/schematypes.html (Achten Sie auf die Mischdatentyp)

Hinweis:

Es gibt auch andere Möglichkeiten, Erstellen Sie dieses Schema. Eine Möglichkeit besteht darin, Attribute als eingebettetes Dokument mit allen Kombinationen von Attributen zu verwenden und den Wert als null zu behalten, wenn dies nicht zutrifft.

Hoffe, das hilft.

Verwandte Themen