Mongoose模式中的多维数组

时间:2014-03-06 11:36:53

标签: node.js mongoose multidimensional-array

如何在Mongoose模式中定义多维数组?我希望在我的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来解决此问题,但我无法在创建时验证会议室数据。

3 个答案:

答案 0 :(得分:3)

AFAIK,目前在mongoose中没有对多维数组利用的支持。

话虽如此,正如您所指出的那样,您可以使用Schema.Types.Mixed SchemaType解决此问题,但随后您将失去使用本机猫鼬类型的所有好处。

但是,您可以通过使用custom validators来定义自己的validation来解决这个问题,正如官方文档所指出的那样(它们非常易于使用)。自定义验证的唯一警告是它们仅在保存实例时触发。

如果您需要触发验证和启动时间,则可以使用更低级别的middleware hooks,它可以为您提供精细控制,因为您可以通过以下操作调用它们:

  • init
  • validate
  • save
  • remove

(请注意init挂钩)

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

答案 1 :(得分:0)

您的架构定义必须是(我还根据您的架构重构了您的字段名称。使用类似字段的保留关键字可能会很危险);

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

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

答案 2 :(得分: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]);
  }
}