2014-03-06 3 views
1

Как определить многомерный массив в схеме Mongoose? Я хочу иметь 2d-массив в моей схеме мангуста, чтобы найти комнату в гостинице примерно так.Многомерный массив в схеме Mongoose

var Room = new Schema({ 
    number: Number, 
    type: String, // Room type id  
}); 

var Hotel = new Schema({ 
    ... 
    rooms: [[Room]]  
}); 

Вот ошибка я получаю ...

D:\projects\HotelBox\node_modules\mongoose\lib\schema\array.js:58 
this.caster = new caster(null, castOptions); 
      ^
TypeError: object is not a function 
at new SchemaArray 

я могу это исправить, определив rooms как Schema.Types.Mixed но я не могу подтвердить данные номеров в момент создания.

ответ

0

Ваше определение схемы должно быть (я также реорганизовал ваши имена полей в соответствии с вашей схемой. Может быть опасно использовать зарезервированные ключевые слова как поля);

var Room = new Schema({ 
    room_number: Number 
    room_type: String, // Room type id  
}); 

var Hotel = new Schema({ 
    ... 
    rooms: [Room]  
}); 
+0

Это обычный массив. Мне нужно сделать 2d-массив – nabeel

+0

Почему вы хотите использовать 2d-массив? В схеме вашего отеля будет несколько номеров. Но вам нужно использовать субдокумент. Я не понял 2d –

+0

Это потому, что мне нужно показать комнаты в 2d или, возможно, даже 3d-сетке – nabeel

3

AFAIK, в настоящее время нет такой поддержки в мангусте для использования многомерных массивов.

Это указано, и, как вы указали, вы можете обойти это с помощью схемы SchemaType Schema.Types.Mixed, но тогда вы потеряете все преимущества, которые принесли для использования родных типов мангуста.

Однако вы можете преодолеть это, определив свои собственные validation s, используя custom validators, как указано в официальных документах (они очень просты в использовании). Единственное предостережение с пользовательскими проверками заключается в том, что они запускаются только при сохранении экземпляра.

Если то, что вам нужно, чтобы вызвать валидации и время initilization, вы можете использовать более низкий уровень middleware hooks, который дает вам мелкозернистый контроль, так как вы можете вызывать их в следующих действиях:

  • init
  • validate
  • save
  • remove

(обратите внимание на init крюк)

Надеется, что это поможет вам преодолеть свой вариант использование.

0

Вы можете разместить координаты номеров в своей модели, например.

var Room = new Schema({ 
    x: Number, 
    y: Number, 
    room_number: Number, 
    room_type: String, // Room type id  
}); 

var Hotel = new Schema({ 
    ... 
    rooms: [Room]  
}); 

Затем создать массив всех номеров:

var rooms = []; 
var i = 0; 
for (var y = 0; y<dim; y++) { 
    for (var x = 0; x < dim; x++) { 
    rooms[i] = new Room(x, y, ...); 
    } 
} 

Тогда insertMany в мангуста. И на стороне клиента вы можете выполнять итерацию по всему массиву, разбивая его, например.

var chunks = _.chunk(_.range(side*side), side) 
for (var chunk in chunks) { 
    for (var i in chunk) { 
    console.log(rooms[i]); 
    } 
} 
Смежные вопросы