2014-09-04 2 views
0

У меня есть модель данных, которая выглядит следующим образом:Настройка модели данных в качестве свойства другой модели данных

var PersonSchema = new Schema({ 
    id: String, 
    fruit: Fruit 

}); 


var FruitSchema = new Schema({ 
    type: String, 
    calories: Double 
}); 

Можно ли установить пользовательский объект как тип данных? Я использую Express & Mongoose.

ответ

1

Вы можете создавать собственные типы данных, как указано в documentation, но они, как правило, относятся к «типам данных» и являются «плагинами», такими как mongoose-long, которые обеспечивают новый тип данных с ожидаемым поведением.

Но, похоже, вы ссылаетесь на ссылку на другую «Схему», чтобы определить, что хранится в поле, что является другим случаем. Таким образом, вы не можете просто сбрасывать схему как «тип» для поля, так как на самом деле, если вы попытаетесь, вы получите «ошибку типа», в которой сообщается, что вы не можете делать то, что вы пытаетесь сделать. Лучший способ сделать это просто встраивать определение:

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

var personSchema = new Schema({ 
    name: String, 
    fruit: { 
    name: { type: String }, 
    calories: { type: Number } 
    } 
}); 

var Person = mongoose.model("Person", personSchema); 

var person = new Person({ 
    "name": "Bill", 
    "fruit": { 
    "name": "Apple", 
    "calories": 52 
    } 
}); 

console.log(person); 

Это разрешено, но это не помогает с повторным использованием. Конечно, если вы можете жить с ним, то другой подход, чтобы просто вставить в массив, намерены ли вы хранить более одного или не:

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

var fruitSchema = new Schema({ 
    name: String, 
    calories: Number 
}); 

var personSchema = new Schema({ 
    name: String, 
    fruit: [fruitSchema] 
}); 

var Person = mongoose.model("Person", personSchema); 

var person = new Person({ 
    "name": "Bill", 
    "fruit": [{ 
    "name": "Apple", 
    "calories": 52 
    }] 
}); 

console.log(person); 

Но на самом деле это лишь объекты JavaScript, поэтому, если он это просто то, что вы хотите использовать в нескольких определений схемы, то все, что вам нужно сделать, это определить объект, возможно, даже в его собственном модуле, а затем просто «требуется» объект, где вы хотите его использовать:

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

var Fruit = { 
    name: String, 
    calories: Number 
}; 

var personSchema = new Schema({ 
    name: String, 
    fruit: Fruit 
}); 

var Person = mongoose.model("Person", personSchema); 

var person = new Person({ 
    "name": "Bill", 
    "fruit": { 
    "name": "Apple", 
    "calories": 52 
    } 
}); 

Также отмечая, что «Double» в вашем списке не является стандартным типом и действительно требует «плагина типа» для mongoose-double, чтобы использовать что.

Смежные вопросы