【问题标题】:Mongodb reference in Node.JS applicationNode.JS 应用程序中的 Mongodb 引用
【发布时间】:2018-03-17 07:36:25
【问题描述】:

我正在做这个副项目,并决定在构建网站的过程中我会使用一些新的东西来学习,所以对于我的数据库解决方案,我使用的是 Mongo(mongoose)。这个想法很简单,我有 2 个模式 - 一个持有玩家,另一个持有游戏:

var Player_Object = new Schema({
 "name": {
        type: String,
  },
  "words": {
        "to_guess":[String],
        "hint":[String]
  }
});

var gameIdSchema = new Schema({
  "name": {
        type: String,
        unique: true
  },
  "number_of_words": Number,
  "password": String,
  "creatingDate": Date,
  "players": [Player_Object],
  "teams": [{
        "team_number":Number,
        "team_name":String,
        "score" : 
              [{ "round_number" : Number,
                  "total_score" : Number,
                  "points"      :[Number]
              }],
        "players": [Player_Object]
  }]
});

如您所见,游戏模式包含游戏中所有玩家的数组,以及包含玩家数组的团队数组(在此过程中稍后分配)。我的印象是游戏模式引用了玩家模式(因为当我在玩家模式和游戏内模式中签入数据库玩家时共享相同的 ID),但事实并非如此。

这里只是提供一些背景知识,这是我在创建新游戏时所拥有的:

    let newGame = new Games({
    name: gameData.name,
    password: gameData.password,
    players: newPlayers,
    number_of_words: gameData.number_words,        
    teams: teams                     
    }); //new game created

稍后在代码中,玩家将编辑他们的单词,当我签入数据库时​​,我可以看到玩家模式中的单词已被编辑,但是当我检查游戏模式时 - 没有任何改变。我知道这是由于缺乏参考。因为当我更新单词时,我只在 Player 模式中更新它们。

我的想法是,当玩家更新时,游戏模式应该看到这个玩家现在包含这个词。

我查看了 mongoDb 注释并尝试了几种方法,但似乎没有任何结果。所以 2 个问题:在这里引用\定义模式的正确方法是什么?以及我将如何更新播放器,以便它们在任何地方都得到更新?

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb reference


    【解决方案1】:

    您在这里所做的是在游戏模式和团队模式中添加玩家对象。它不是一个参考,它似乎是一个不同的对象。因此,如果您更新球员,游戏中的球员和球队将不会得到更新。 MongoDb 没有这样的功能。 Mongoose 提供了一些东西,但 mongoose 库会处理它。 http://mongoosejs.com/docs/populate.html

    您应该做的是在游戏和团队中存储玩家 ID。或者在玩家中存储gameId和teamId(根据你想查询和返回结果的方式)

    MongoDb 中的每个集合(表)都是独立的,您无法创建引用。

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多