如何在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
来解决此问题,但我无法在创建时验证会议室数据。
答案 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]);
}
}