Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose模式中的多维数组_Node.js_Mongoose_Multidimensional Array - Fatal编程技术网

Node.js Mongoose模式中的多维数组

Node.js Mongoose模式中的多维数组,node.js,mongoose,multidimensional-array,Node.js,Mongoose,Multidimensional Array,如何在Mongoose模式中定义多维数组?我希望在我的mongoose模式中有一个2d数组,以便在类似这样的酒店中找到一个房间 var Room = new Schema({ number: Number, type: String, // Room type id }); var Hotel = new Schema({ ... rooms: [[Room]] }); 这是我得到的错误 D:\projects\HotelBox\node_module

如何在Mongoose模式中定义多维数组?我希望在我的mongoose模式中有一个2d数组,以便在类似这样的酒店中找到一个房间

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
来修复它,但是我无法在创建时验证文件室数据。

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


AFAIK,目前mongoose中没有对多维阵列利用的支持

话虽如此,正如您所指出的,您可以通过使用
Schema.Types.Mixed
SchemaType来解决这个问题,但是这样一来,您将失去所有使用原生猫鼬类型的优点

但是,您可以通过使用来定义自己的
验证
s来克服这一问题,正如官方文档所指出的那样(它们非常容易使用)。自定义验证的唯一警告是,只有在保存实例时才会触发它们

如果您需要的是触发验证和初始化时间,那么可以使用较低级别的方法,这将为您提供细粒度的控制,因为您可以在以下操作中调用它们:

  • init
  • 验证
  • 保存
  • 删除
(注意
init
hook)


希望这能帮助您克服您的用例。

您可以在模型中放置房间坐标,例如:

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

这是一个规则数组。我需要制作一个二维阵列为什么要使用二维阵列?您的酒店将有几个房间。但您需要使用子文档。我不懂2d,那是因为我需要在2d甚至3d网格布局中显示房间,但mongoose中没有这样的属性。你需要重构你的设计我知道这是个老问题。。但是我面临着同样的问题。。我计划使用的解决方案是对@HüseyinBABAL给出的答案稍加修改。我使用的不是
var-RoomRow=newschema({})
而是
var-RoomRow=newschema({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, ...);
  }
}
var chunks = _.chunk(_.range(side*side), side)
for (var chunk in chunks) {
  for (var i in chunk) {
    console.log(rooms[i]);
  }
}