我正在尝试与Mongoose进行我的第一次关系测试,我想知道在进一步研究之前我是否做了相关的事情。
我有两个模型:Galaxy和StarSystem。 Galaxy有很多StarSystems,而StarSystem有一个Galaxy。
以下是我的模特:
Galaxy:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var galaxySchema = new Schema({
name: {
type: String,
required: true
},
planets: [{
type: Schema.Types.ObjectId,
refs: 'StarSystem'
}]
});
var Galaxy = mongoose.model('Galaxy', galaxySchema);
module.exports = Galaxy;
StarSystem:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var starSystemSchema = new Schema({
name: {
type: String,
required: true
},
xPosition: {
type: Number,
required: true
},
yPosition: {
type: Number,
required: true
},
starType: {
type: Number,
required: true,
min: 0,
max: 7
},
galaxy: {
type: Schema.Types.ObjectId,
ref: 'Galaxy',
required: true
}
});
var StarSystem = mongoose.model('StarSystem', starSystemSchema);
module.exports = StarSystem;
StarSystem路线:
var router = require('express').Router();
var config = require('../config');
var StarSystem = require('../models/star_system');
var Galaxy = require('../models/galaxy');
router.get('/', function(req, res) {
StarSystem.find().exec(function(err, starSystems) {
res.json(starSystems);
});
});
router.get('/:id', function(req, res) {
StarSystem.findById(req.params.id, function(err, starSystem) {
if (undefined === starSystem) {
res.status(404).json({
message: 'Star System not found.'
});
}
else {
res.json(starSystem);
}
});
});
router.post('/', function(req, res) {
var starSystem = new StarSystem(req.rawBody);
starSystem.save(function(err, starSystem) {
if (null != err) {
res.status(500).json(err);
}
else {
res.status(201).json({
location: config.app.domain + '/star-systems/' + starSystem._id
});
}
});
Galaxy.findById(req.rawBody.galaxy, function(err, galaxy) {
galaxy.planets.push(starSystem);
galaxy.save();
});
});
module.exports = router;
我的问题是关于我在“POST”方法中处理向Galaxy添加StarSystem的方式。我目前正在将它添加到阵列中,但我不知道是否有更快/更容易的东西。我很感激有关我的代码的任何建议。
答案 0 :(得分:0)
你应该问问自己为什么你首先要从银河系到星系的参考。
当您检索Galaxy
对象时,您所了解的星系统就是_id的列表。除了可能知道有多少之外,_id单独给你的应用程序什么都没有。要获取有关星系的任何有用数据,您需要在StarSystem
集合上执行后续查询以解析引用。
因此,当您需要查询StarSystem
集合时,您可以在等待来自Galaxy的结果的同时执行此操作,方法是找到StarSystem
与galaxy:galaxyId
的{{1}}
这不仅速度更快,而且还提高了一致性(不可能出现矛盾的StarSystem-> Galaxy和Galaxy-> StarSystem参考),最重要的是它阻止了Galaxy对象的增长。 MongoDB不喜欢增长对象,因为每当对象增长到其大小的两倍时,数据库需要将其从硬盘驱动器中删除并将其附加到文件的末尾,这会降低写入性能。
当你有一个n:m关系时,引用数组可能有用的情况。但除非您要模拟galaxy collisions,否则您将永远不会拥有属于多个StarSystem
的{{1}}。