Mongoose模式中的multidimensional array

我如何在Mongoose模式中定义multidimensional array? 我想在我的mongoose模式中有一个二维数组,以便在宾馆find这样的房间。

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来修复它,但是在创build时我无法validation房间数据。

AFAIK,目前在multidimensional array利用的mongoose中没有这样的支持。

这就是说,正如你所指出的,你可以通过使用Schema.Types.Mixed SchemaType来解决这个问题,但是你将失去所有使用本地mongoosetypes的好东西。

但是,您可以通过使用自定义validation器来定义您自己的validation来克服这个问题,就像在官方文档中指出的那样(它们非常易于使用)。 自定义validation唯一的警告是,它们仅在保存实例时才被触发。

如果您需要触发validation和启动时间,则可以使用更低级别的中间件挂钩 ,因为您可以通过以下操作调用它们,因此可以进行细粒度控制:

  • init
  • validate
  • save
  • remove

(注意init钩子)

希望这可以帮助你克服你的用例。

您的模式定义必须是(我也根据您的模式重构了您的字段名称,使用保留的关键字字段可能很危险)。

 var Room = new Schema({ room_number: Number room_type: String, // Room type id }); var Hotel = new Schema({ ... rooms: [Room] }); 

你可以在你的模型中放置房间的坐标

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

然后创build一个所有房间的数组:

 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, ...); } } 

然后在mongoose中insertMany 。 而在客户端,你可以遍历所有的数组,例如

 var chunks = _.chunk(_.range(side*side), side) for (var chunk in chunks) { for (var i in chunk) { console.log(rooms[i]); } }