2017-04-24 2 views
0

Ich habe gelernt, MongoDB von ihrem online Webinar gehostet auf ihrer Website und ich versuche, Produkte zu einer Kategorie (z. B. iPhone gehört zu Kategorie Handys, die Vorfahren wie Elektronik hat), jedoch während der Verschachtelung ich erhalte die folgende Fehlermeldung:Nesting MongoDB Schema

MongooseError: Schema hasn't been registered for model "Category". 
Use mongoose.model(name, schema) 

ich einige Fragen sah, von Schema.ObjectId und Schema.Types.ObjectId zu schreiben, aber ich Cast Error to ObjectId auf einen Einsatz Brennen (speichern) Abfrage.

Es gibt einige Fragen im Zusammenhang mit diesem:

  1. Wie kann ich sicher sein, während ein Produkt hinzufügen, ich auch noch die Kategorie es verknüpft ist?
  2. Was wäre eine Best Practice für ein solches Szenario (zum Hinzufügen von Filialdokumenten oder Referenzschemas)?

PFB Modelldateien habe ich Controller-Dateien oben auf, dass, um CRUD-Operationen geschrieben auszuführen:

category.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var categorySchema = new Schema({ 
    _id: { type: String }, 
    parent: { 
    type: String, 
    ref: 'Category' 
    }, 
    ancestors: [{ 
    type: String, 
    ref: 'Category' 
    }] 
}); 

module.exports.categorySchema = categorySchema; 

products.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var Category = require('./category'); 
var fx = require('./fx'); 

var productSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    // Pictures must start with "http://" 
    pictures: [{ type: String, match: /^http:\/\//i }], 
    price: { 
    amount: { 
     type: Number, 
     required: true, 
     set: function(v) { 
     this.internal.approximatePriceUSD = 
      v/(fx()[this.price.currency] || 1); 
     return v; 
     } 
    }, 
    // Only 3 supported currencies for now 
    currency: { 
     type: String, 
     enum: ['USD', 'EUR', 'GBP'], 
     required: true, 
     set: function(v) { 
     this.internal.approximatePriceUSD = 
      this.price.amount/(fx()[v] || 1); 
     return v; 
     } 
    } 
    }, 
    category: { type: Schema.ObjectId,ref: 'Category'}, 
    internal: { 
    approximatePriceUSD: Number 
    } 
}); 

//var schema = new mongoose.Schema(productSchema); 

var currencySymbols = { 
    'USD': '$', 
    'EUR': '€', 
    'GBP': '£' 
}; 

/* 
* Human-readable string form of price - "$25" rather 
* than "25 USD" 
*/ 
productSchema.virtual('displayPrice').get(function() { 
    return currencySymbols[this.price.currency] + 
    '' + this.price.amount; 
}); 

productSchema.set('toObject', { virtuals: true }); 
productSchema.set('toJSON', { virtuals: true }); 

module.exports = mongoose.model("Product", productSchema); 

Beispiel Ausgabestruktur eines P roduct:

{ 
    "_id": "**autogeneratedByMongo", 
    "name":"iPhone", 
    "category":{ 
     "_id":"Mobiles", 
     "ancestors":["Electronics","Mobiles"] 
    } 
    .... 
} 

Antwort

0

Ändern Sie den Wert des type Schlüssel zu mongoose.Schema.Types.ObjectId es Link zu diesem perticular ObjectId machen wird, auf die Sie und mit Hilfe von bevöl beziehen möchten, können Sie Anruf ganze Eltern Schema von .populate('parent') machen.

Für mehr Informationen von I reffer dazu: - populate

Dank.

+0

aber wenn ich hinzufügen mongoose.Schema.Types.ObjectId, und ich versuche, Daten in folgenden Weise einzufügen: { \t "name": "LG G4", \t "Bilder": "http: // google“, \t "Preis": { \t \t "Menge": 300, \t \t "Währung": "USD" \t}, \t "Kategorie": "Laptops" } ich Cast Fehler zu ObjectId erhalten . Ich werde unterdessen über Population lesen. – Hardik

+0

tun Sie es wie folgt: - Kategorie: '{Typ: mongoose.Schema.Types.ObjectId, ref: 'Kategorie'}' und geben Sie nicht die _id Mannnaly, weil mongodb wird automatisch _id zur Datenbank zur Verfügung stellen, die überall einzigartig ist Datenbank (Random ObjectId) – hardy

+0

, aber ich bekomme immer noch Nachricht: 'Cast to ObjectID für Wert fehlgeschlagen' Fehler. – Hardik