用几个可以更新的数组构建一个api

时间:2016-08-02 19:44:39

标签: node.js mongodb express mongoose

我是noSQL的新手,我想弄清楚如何创建最好的模型结构。我需要做的是每小时从api检索联赛和比赛并将其添加到我的数据库。每小时得分可能会改变,并且可能会在每个联赛中添加新的比赛,因此这应该可以在模型中使用。我已经阅读了文档并创建了以下内容,但是我不确定是否可以更新每个文档并为联盟添加新的匹配项。什么是理想的建模?

锦标赛模型

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;
var League     = require('./league');

var TournamentSchema = new Schema({
    slug: String,
    tournaments: [League]
});

module.exports = mongoose.model('Tournament', TournamentSchema);

联赛

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;
var Match    = require('./match');

var leagueSchema   = new Schema({
    leaguetId: Number,
    name: String,
    matches: [Match]

});

module.exports = mongoose.model('League', leagueSchema);

匹配

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var matchSchema   = new Schema({
    homeTeam: String,
    awayTeam: String,
    homeScore: Number,
    awayScore: Number,
    start: Date


});

module.exports = mongoose.model('Match', matchSchema);

到目前为止发布请求

router.post('/tournaments', function(req, res, next) {

      var tournament = new Tournament();      // create a new instance of the Bear model
       tournament.name = req.body.slug;  // set the bears name (comes from the request)

       // save the bear and check for errors
       tournament.save(function(err) {
           if (err)
               res.send(err);

           res.json({ message: 'Tournament created!' });
       });

});

1 个答案:

答案 0 :(得分:1)

如果您要为联赛添加新的比赛并按时间间隔更新比赛,为什么要将它们嵌套在一起?假设你有一个匹配id为5的分数改变了。为了找到它来更新它你必须首先通过每个联赛,然后遍历每个联赛中的每场比赛,直到你找到与id为5的比赛。除非我错了并且有一些更简单的方法来做到这一点,这似乎效率很低。

为什么没有两个系列?联赛收藏和比赛集合。将有一个(联赛):许多(匹配)关系。当你需要更新比赛的分数时,谁会关心它的联赛?在匹配集合中搜索id 5,并进行更新。

新比赛会是什么样的?让我们说一个身份7的联赛有一场新的比赛。将匹配添加到联盟ID为7的匹配集合中。

如果你真的反对离开一个集合..至少将你的匹配存储在一个对象而不是一个数组中,那么你可以通过使用它的匹配名来找到具有O(1)查找时间的匹配。而不是像你现在拥有的O(n)或O(n ^ 2)查询时间。