2015-09-20 3 views
0

Я хочу иметь двух типов пользователей на моем сайте - обычных пользователей и веб-дизайнеров.mongoose: как выбрать один из двух типов

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

ответ

0

этом «выбор» между двумя типами полностью зависит от того, что вы имеете в виду.

В простом случае, когда вы просто хотите несколько значений, чтобы быть действительными для свойства из списка выбора, то вы можете использовать enum сделать только значения одной из возможностей:

var userSchema = new Schema({ 
    "type": { "type": String, "emum": ["normal","developer] } 
}); 

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

Если вы хотите что-то более продвинутое, например, по существу разные объекты с расширенными полями для каждого типа, то для вас вероятны «дискриминаторы».

Это позволяет вам иметь разные свойства между обычным «пользователем» и «разработчиком», например, список проектов для разработчика. Все они будут сохранены в той же коллекции, но они являются объектами первого класса с правилами все их собственное определение схемы и:

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

mongoose.connect('mongodb://localhost/test'); 

function BaseSchema() { 
    Schema.apply(this,arguments); 

    this.add({ 
    name: String, 
    createdAt: { type: Date, default: Date.now } 
    }); 
} 

util.inherits(BaseSchema,Schema); 

var userSchema = new BaseSchema(); 
var developerSchema = new BaseSchema({ 
    projects: [String] 
}); 

var User = mongoose.model('User',userSchema), 
    Developer = User.discriminator('Developer', developerSchema); 

async.series(
    [ 
    function(callback) { 
     User.remove({},callback); 
    }, 
    function(callback) { 
     async.eachSeries(
     [ 
      { "role": "User", "name": "Bill" }, 
      { "role": "Developer", "name": "Ted", "projects": [ 
      "apples", "oranges" ] } 
     ], 
     function(item,callback) { 
      mongoose.model(item.role).create(item,callback); 
     }, 
     callback 
    ); 
    }, 
    function(callback) { 
     User.find().exec(function(err,docs) { 
     console.log(docs) 
     callback(err); 
     }); 
    } 
    ], 
    function(err) { 
    if (err) throw err; 
    mongoose.disconnect(); 
    } 
); 

Какой вывод показывает два объекта в одной и той же коллекции:

[ { _id: 55ff7b22f1ff34f915cc8312, 
    name: 'Bill', 
    __v: 0, 
    createdAt: Mon Sep 21 2015 13:36:02 GMT+1000 (AEST) }, 
    { _id: 55ff7b22f1ff34f915cc8313, 
    name: 'Ted', 
    __v: 0, 
    __t: 'Developer', 
    createdAt: Mon Sep 21 2015 13:36:02 GMT+1000 (AEST), 
    projects: [ 'apples', 'oranges' ] } ] 

Обратите внимание, что у «Теда» «Разработчик» имеет другое поле, сохраненное как __t, которое содержит значение дикриматора для модели. Это позволяет мангусте применять магию, когда ее читают, которая отличает правильный объект.

Это также означает, что каждая модель может быть использована независимо друг от друга, с операциями, такими как:

Developer.find().exec(function(err,developers) { }); 

Developer.create(newDev,function(err,developer) { }); 

, которые соответственно «магическим образом вставить» «тип», так что только соответствие __t: 'Developer' объекты либо найдены или созданы каждой операции ,

Таким образом, enum предоставит вам ограничение на возможные значения, а discriminator() позволит вам установить полностью независимые определения объектов в целом. Зависит от того, какую форму вы имеете в виду, но оба хороши в использовании.

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