2016-08-12 2 views
0

Ich musste vor kurzem ein Projekt konvertieren, das viel Arbeit mit ASP.NET Core 1.0 zu Node.js hatte. Ich bin absolut nicht in meiner Komfortzone, da ich kaum etwas über JavaScript weiß und das gute Leben von ASP-Serialisierung von C# -Klassen für mich hatte, ohne dass ich JSON selbst machen müsste. Node möchte, dass ich selbst den JSON mache, mit dem ich eine schlechte Zeit habe.Benutzerdefinierte "Typen" in JSON (Knoten/Express) und JSON-Arrays

Es ist eine Fitness-App. Sie haben Kunden mit etwas Fortschritt, die ihre Aufzüge und Zeug enthalten. In C# ist, dass in einem Traininge Objekt, wie unten zu sehen:

public struct Progress 
    { 
     public Workout[] Workouts; 
    } 

Workouts ist ein wiederverwendbares Objekt Dinge wie Timing enthält, Sätze, Wiederholungen, all die guten Sachen. Ich könnte das Workouts-Objekt einfach in jedes einzelne meiner Schemas umschreiben, die es brauchen, aber es muss einen besseren Weg geben? Ich lese etwas über $schema und $ref, aber ich bin nicht vertraut mit der Verwendung von ihnen oder wenn dies die richtige Anwendung dieser Schlüsselwörter ist.

Schließlich, wie würde ich ein Array dieses benutzerdefinierten Workout-Objekts definieren?

Dies ist mein JSON-Objekt und der Inhalt von client.js bisher. Das Fortschrittsbit ist das, was ich am liebsten erreichen möchte.

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var ClientSchema = new Schema({ 
    measurements: [{ 
     height: Number, 
     weight: Number 
    }], 
    personal_information: [{ 
     birthday: Date, 
     gender: String 
    }], 
    contact_information: [{ 
     phone: String, 
     email: String 
    }], 
    progress: [{ 
     workouts: WorkoutList 
    }] 
}); 
+0

Sind Sie fragen, ob ein Schema ein anderes Schema für eingebettete Dokumente verwenden kann? –

+0

@JasonCust vielleicht? Ich verwende das Workouts-Schema in einigen anderen Schemata, damit ich es vermeiden möchte, es immer wieder in den verschiedenen Schemas zu schreiben und einfach "Fortschritt: Training" zu nennen. Irgendwelche Ideen? – KingDan

+0

Es hängt davon ab, ob Sie erwarten, dass die gleichen Daten in den verschiedenen Schemas enthalten sind oder wenn Sie nur die gleiche Struktur haben möchten. Wenn beispielsweise ein Dokument aus 'ClientSchema' erstellt wurde, das ein Unterdokument 'client.progress []. Workouts' enthält, müssten die von diesem Unterdokument dargestellten Daten nur von diesem bestimmten Client-Dokument aus zugänglich sein oder würden es auch brauchen ein Unterdokument in einem anderen Dokument (Kunde oder nicht) sein? –

Antwort

1

Wenn Sie nur eine gemeinsame Datenstruktur mögen, die dann in verschiedenen anderen Modellen verwendet werden können Sie ein sub-doc schema erstellen können (das kann oder auch nie sein eigenes Modell hat), die durch verschiedene andere Schemata verwendet werden.

HINWEIS: Dies stellt ein Singleton-Schema-Objekt zur Verfügung, was bedeutet, wenn Sie ein Modell ändern würden, würde es an andere Modelle weitergegeben, die es später verwenden. Wenn das ein Problem ist, können Sie workout-list-schema.js in eine Factory-Funktion konvertieren, die jedes Mal ein neues Schemaobjekt zurückgibt.

Training-list-schema.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var WorkoutListSchema = module.exports.WorkoutListSchema = new Schema({ 
    // some schema 
}); 

Client-schema.js

var mongoose = require('mongoose'); 
var WorkoutListSchema = require('./workout-list-schema').WorkoutListSchema; 
var Schema = mongoose.Schema; 

var ClientSchema = new Schema({ 
    measurements: [{ 
    height: Number, 
    weight: Number 
    }], 
    personal_information: [{ 
    birthday: Date, 
    gender: String 
    }], 
    contact_information: [{ 
    phone: String, 
    email: String 
    }], 
    progress: [{ 
    workouts: WorkoutListSchema 
    }] 
}); 
+0

Das ist großartig, danke! Weißt du, wie man das Workoutlisten-Schema zu einer tatsächlichen Liste macht (wie ein Array von Workouts)? – KingDan

+0

@KingDan Ich bin mir nicht sicher, was Sie meinen, aber wenn Sie sagen, dass 'Workouts' eine Liste sind, dann können Sie das Schema folgendermaßen bearbeiten:' workouts: [WorkoutListSchema] '. –

+0

das ist absolut was ich wollte. Du bist ein Juwel. Vielen Dank :) – KingDan

Verwandte Themen