我的ManyToOne关系是否正确?

时间:2015-07-28 10:32:49

标签: node.js mongodb mongoose

我正在尝试与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的方式。我目前正在将它添加到阵列中,但我不知道是否有更快/更容易的东西。我很感激有关我的代码的任何建议。

1 个答案:

答案 0 :(得分:0)

你应该问问自己为什么你首先要从银河系到星系的参考。

当您检索Galaxy对象时,您所了解的星系统就是_id的列表。除了可能知道有多少之外,_id单独给你的应用程序什么都没有。要获取有关星系的任何有用数据,您需要在StarSystem集合上执行后续查询以解析引用。

因此,当您需要查询StarSystem集合时,您可以在等待来自Galaxy的结果的同时执行此操作,方法是找到StarSystemgalaxy:galaxyId的{​​{1}}

这不仅速度更快,而且还提高了一致性(不可能出现矛盾的StarSystem-> Galaxy和Galaxy-> StarSystem参考),最重要的是它阻止了Galaxy对象的增长。 MongoDB不喜欢增长对象,因为每当对象增长到其大小的两倍时,数据库需要将其从硬盘驱动器中删除并将其附加到文件的末尾,这会降低写入性能。

当你有一个n:m关系时,引用数组可能有用的情况。但除非您要模拟galaxy collisions,否则您将永远不会拥有属于多个StarSystem的{​​{1}}。