在Mongoose / MongoDB中将对象保存在嵌套模式中

liwlm1x9  于 2023-05-07  发布在  Go
关注(0)|答案(1)|浏览(165)

我是使用MongoDB和Mongoose的新手,我有一种感觉,我做错了什么。
假设我在Mongoose中有以下模式:

const characterSchema = new Schema({
  name: {
    required: true,
    type: String,
  },
});

const gameSchema = new Schema({
  name: {
    required: true,
    type: String,
  },
  characters: [characterSchema],
});

对我来说,这告诉我,我有一个一对多的关系,一个游戏有很多角色。但是,如果我对一个角色执行更新... await Character.findOneAndUpdate,然后运行db.characters.find()db.games.find(),字符的两个条目将不同。只有其中一个会更新。
这告诉我这是两个独立的数据示例。。我也不知道我为什么要那样。我更愿意更新模型一次,让它在所有地方都能反映出来。我做错什么了吗?有没有一种方法可以写Character模型或game.characters[0]这样的游戏示例,并且只需要更新一次数据?
谢谢你的时间。

cxfofazt

cxfofazt1#

对于这种情况,有两种通用方法:
首先,一个更具可扩展性的方法是创建一个“中介”引用模式,作为游戏和角色之间的一对一关系--

// GameCharacter schema
{
    "character" : {
        type: mongoose.Types.ObjectID,
        ref: 'characters',
        required: true
    },
    "game" : {
        type: mongoose.Types.ObjectID,
        ref: 'games',
        required: true
    }
}

第二,如果你认为一个给定游戏的角色引用的数量将保持在相对最小的水平,你可以选择将角色引用保存在游戏对象中,而不是创建一个单独的引用模式。

// Game schema
{
    ...
    "characters" : [
        {
            type: mongoose.Types.ObjectID,
            ref: 'characters',
            required: true
        }
    ]
}

在这两种情况下,都可以使用聚合管道或populate从引用中获取嵌套信息。

相关问题