你会如何设计这种特殊的多对多Mongodb Schema?(mongoose)

时间:2016-10-28 12:31:15

标签: node.js mongodb mongoose

我正在尝试为战士和战斗制作数据库。 每场战斗都有两名战士和一些关于战斗本身的信息。 每个战士都有战斗记录和一些个人信息。 所以我想谈谈这两个架构。 我制作了这些模式,但不确定我是否正确使用Mongoose。这是正确的方法吗?

这是战斗机的架构。

var mongoose = require("mongoose");

var fighterSchema = new mongoose.Schema({
    image: String,
    firstName: String,
    lastName: String,
    nickName: String,
    height: {
        foot: Number,
        inch: Number
    },
    weightClass: String,
    reach: Number,
    stance: String,

    dob: Date,
    country: String,

    fights: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Fight"
        }


    ]

})



module.exports = mongoose.model("Fighter", fighterSchema);

这是战斗模式。

var mongoose = require("mongoose");



var fightSchema = new mongoose.Schema({

    fighters: [
       {
            fighter: {
                type: mongoose.Schema.Types.ObjectId,
                ref: "Fighter"
        },


        knockDown: Number,
        significantStrikeLanded: Number,
        significantStrikeThrow: Number,
        takeDowns: Number,
        takeDownAttempts: Number,
        submissionAttempts: Number,
        result: String
    },

    {
        fighter: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Fighter"
        },


        knockDown: Number,
        significantStrikeLanded: Number,
        significantStrikeThrow: Number,
        takeDowns: Number,
        takeDownAttempts: Number,
        submissionAttempts: Number,
        result: String
    }


    ],


info : {

        noContest: Boolean,
        weightClass: String,
        method: String,
        round: Number,
        min: Number,
        sec: Number,
        timeFormat: {
            rounds: Number,
            min: Number,
        },

        referee: String,
        details: String,
        date: { type: Date, default: Date.now },
        eventCategory: String,


    }




})


module.exports = mongoose.model("Fight", fightSchema);

2 个答案:

答案 0 :(得分:0)

如果您阅读关于关系的mongodb文档,您会发现在mongodb中他们说过,除非它非常重要并且存在大量冗余,您可以简单地将一个依赖文档嵌入到另一个中。

在你的情况下,每场战斗只有两个战士,所以你可以简单地在战斗文件中嵌入战斗机的细节

fight{
...
fighters:{fighter 1}, {fighter 2}

}

这一点都不错。

或者另一种简单的方法是在战斗模式中删除战士的参考,并简单地保持战斗机和战斗之间的一对多关系。

答案 1 :(得分:0)

评论部分很小,所以把它放在这里: -

好吧,让我举一个例子,看看这是否有意义。

战士集合

{
_id: fighter1, 
name: xxxx, 
age: 22, 
skills :[a, b,c], 
fightsParticipated:[fight1, fight3, fight10....]},
{
_id: fighter2, 
name: yyyy, 
age: 25, 
skills :[ b,c,d], 
fightsParticipated:[fight4, fight7, fight10....]
} ,
{.................}

战斗集合:

{
_id: fight10,
knockDown: Number,
        significantStrikeLanded: Number,
        significantStrikeThrow: Number,
        takeDowns: Number,
        takeDownAttempts: Number,
        submissionAttempts: Number,
        result: String
}

现在从上面的例子中我们可以看到战斗机1参加了战斗1,战斗3和战斗10和战斗机2在战斗4,战斗7和战斗10.所以两个战斗机在战斗10中相互战斗。

这里唯一的重复数据是你为每个战斗机存储的战斗ID,并没有太多的冗余。

同样在这种情况下,战斗10可以是只有两个战士的一部分,如果你在你的收集中有另外5个战士,那么10个战斗机将在他们的战斗参与名单中,因为只有两个战士之间的战斗。

让我知道这是否有意义。