首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于mongoDB的JSON去氧

用于mongoDB的JSON去氧
EN

Stack Overflow用户
提问于 2014-01-15 04:21:49
回答 1查看 546关注 0票数 1

我想这就是我要找的词。我在试着把父母的信息放进每张卡片里。我想这就是我需要做的,但是如果你有其他的想法的话,请加入进来。

代码语言:javascript
代码运行次数:0
运行
复制
{
  "LEA": {
    "name": "Limited Edition Alpha",
    "code": "LEA",
    "releaseDate": "1993-08-05",
    "border": "black",
    "type": "core",
    "cards": [
      {"name": "Air Elemental"},
      {"name": "Earth Elemental"},
      {"name": "Fire Elemental"},
      {"name": "Water Elemental"}
    ]
  },
  "LEB": {
    "name": "Limited Edition Beta",
    "code": "LEB",
    "releaseDate": "1993-10-01",
    "border": "black",
    "type": "core",
    "cards": [
      {"name": "Armageddon"},
      {"name": "Fireball"},
      {"name": "Swords to Plowshares"},
      {"name": "Wrath of God"}
    ]
  }
}

很明显,这是数据的一小部分。LEALEB是一组卡片,每一组里面都有一堆卡片。我正在考虑去或不正确地把这个变成仅仅的卡片,每一张卡都添加了设定信息。就像这样..。

代码语言:javascript
代码运行次数:0
运行
复制
{
  {
    "name": "Air Elemental",
    "set": {
      "name": "Limited Edition Alpha",
      "code": "LEA",
      "releaseDate": "1993-08-05",
      "border": "black",
      "type": "core"
    }
  },
  {
    "name": "Earth Elemental",
    "set": {
      "name": "Limited Edition Alpha",
      "code": "LEA",
      "releaseDate": "1993-08-05",
      "border": "black",
      "type": "core"
    }
  },
  {
    "name": "Armageddon",
    "set": {
      "name": "Limited Edition Beta",
      "code": "LEB",
      "releaseDate": "1993-10-01",
      "border": "black",
      "type": "core"
    }
  },
  {
    "name": "Fireball",
    "set": {
      "name": "Limited Edition Beta",
      "code": "LEB",
      "releaseDate": "1993-10-01",
      "border": "black",
      "type": "core"
    }
  }
}

首先,我的想法正确吗?我会想要一个庞大的cards集合,并将设置信息平放到每一张卡中吗?在SQL中,我会为这些集合做一个表,并且卡片将belong_to一个集合。我正试着把头脑集中在“文档思考”上。

第二,如果我的想法是正确的,我有什么想法可以实现这种脱脂吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-24 03:14:07

给你。

好的,这就是我要开始的地方。因为我们已经说过卡片永远不会改变(因为它们基于物理MTG卡),创建一个包含所有卡片的集合,这将用于稍后轻松地填充用户的牌。您可以通过卡名或某种类型的卡ID (如存储在卡上的物理ID)对其进行搜索。

对于用户的卡片对象数组,不应该只存储卡的_id字段,因为这迫使您加入。由于卡片永远不会改变,因此完全去角色化,然后将它们推入卡片数组中,因此用户对象,到目前为止,类似于:

代码语言:javascript
代码运行次数:0
运行
复制
{
  name: "Tom Hanks",
  skill_level: 0,
  decks: [
    [
      { 
        card_name: "Balance", 
        card_description: "LONG_BLOCK_OF_DESCRIP_TEXT", 
        card_creator: "Sugargirl14", 
        type: "Normal",
        _id: $SOME_MONGO_ID_HERE,
        ... rest of card data...
      }, {
         ...card 2 complete data...
      }
    ],
    [
      { ...another deck here... }
    ]
  ]
}

好的,回到set信息,我也将假设set信息是一个常量(基于你的SO帖子,我看不出它会如何变化)。因此,如果设置的信息总是与卡片相关,我将对其进行去或删除并将其包括在内,将我们的card对象更改为:

代码语言:javascript
代码运行次数:0
运行
复制
      { 
        card_name: "Balance", 
        card_description: "LONG_BLOCK_OF_DESCRIP_TEXT", 
        card_creator: "Sugargirl14", 
        type: "Normal",
        _id: $SOME_MONGO_ID_HERE
        set: {
          "name": "Limited Edition Alpha",
          "code": "LEA",
          "releaseDate": "1993-08-05",
          "border": "black",
          "type": "core",
          "_id": $SOME_MONGO_ID_HERE
        },
        ... rest of card data...
      }

我认为,将其他卡片存储在非规范化对象中对于给定的卡片是不相关的,如果是的话,就添加它们。如果您注意到,您的SO示例中给出的键将被删除,因为它似乎总是== "code“字段。

好的,现在正确地回答你关于你是否应该在卡片中嵌入集合的问题,反之亦然。首先,这两个集合都是相关的。因此,即使我们将集合嵌入到卡片中,您也希望这些集合在集合中,以便以后可以获取它们并插入到新卡中。

它嵌入了哪些是真正由业务逻辑决定的,数据是如何使用的,以及哪些数据被更频繁地提取。你是否经常显示套装和从它们中提取卡片(比如用户搜索)?您可以将所有卡片数据或任何相关数据嵌入到每组的cards数组中。但是使用上面的数据模型,每一张卡都将其集合ID存储在它的set对象中。我假设卡片只属于一组,所以要获得一个集合的所有卡片,您可以在您想要的集合的set.id == the Mongo ID上查询您的卡集合。现在,由于业务逻辑的原因,集合需要最少的更新(希望没有更新),而且查询仍然很快(并且获得完整的卡片对象)。老实说,我会做后一件事,让我的牌保持干净。因此,卡片拥有它所属的集合,而不是拥有卡的集合。这是一种更多的SQLy方式,可以认为在Mongo实际上可以很好地工作(您永远不会加入)。

因此,我们的最终数据模型类似于:

集合1,一套:

代码语言:javascript
代码运行次数:0
运行
复制
//data model
{
    "name": "Limited Edition Alpha",
    "code": "LEA",
    "releaseDate": "1993-08-05",
    "border": "black",
    "type": "core",
    "_id": $SOME_MONGO_ID_HERE
}

收藏2,卡片:

代码语言:javascript
代码运行次数:0
运行
复制
//data model
{ 
  _id: $SOME_MONGO_ID_HERE
  card_name: "Balance", 
  card_description: "LONG_BLOCK_OF_DESCRIP_TEXT", 
  card_creator: "Sugargirl14", 
  type: "Normal",
  set: {
    "name": "Limited Edition Alpha",
    "code": "LEA",
    "releaseDate": "1993-08-05",
    "border": "black",
    "type": "core",
    "_id": $SOME_MONGO_ID_HERE
     ... rest of card data...
  },
}

集合3,用户:

代码语言:javascript
代码运行次数:0
运行
复制
{
  _id: $SOME_MONGO_ID_HERE,
  name: "Tom Hanks",
  skill_level: 0,
  decks: [
    [
      { 
        card_name: "Balance", 
        card_description: "LONG_BLOCK_OF_DESCRIP_TEXT", 
        card_creator: "Sugargirl14", 
        type: "Normal",
        _id: $SOME_MONGO_ID_HERE,
        set: {
          "name": "Limited Edition Alpha",
          "code": "LEA",
          "releaseDate": "1993-08-05",
          "border": "black",
          "type": "core",
          "_id": $SOME_MONGO_ID_HERE
        },
      }, {
         ...card 2 complete data...
      }
    ],
    [
      { ...another deck here... }
    ]
  ]
}

显然,这是假定每一张卡的集合数据与用户相关。现在您的数据是非规范化的,集合和卡片很少需要更新(根据业务逻辑),因此您将永远不需要级联更新或删除。操纵用户很容易。当您从用户甲板中删除一张卡时,您可以在相关的甲板数组上执行来自Mongo的$pull (我认为这就是它的名称),其中包含的项的_id字段==,您要删除的卡的蒙古ID。所有其他更新都更容易。

回想起来,您可能希望用户的甲板如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
decks: {
  "SOME_ID_HERE": [
    { ...card 1... },
    { ...card 2... }
  ] 
}

这使得识别甲板变得更加容易,并将使您的拉(您将有更多的数据在前端和拉查询将更加精确)。它可以是一个数字,随机字符串,任何真正的,因为它被传递回前端。或者只使用他们的蒙戈身份证,当看甲板的时候,用户会有它的蒙戈ID。然后当他们从里面取出一张卡,或者加上一张卡,你就有了一个直接的标识符,可以很容易地抓取所需的甲板。

显然,所有文本(如:$MONGO_ID_HERE )的值都应该是MongoId()对象。

哇,那是紧张的,6800个字符。希望这对您是有意义的,如果任何词句令人困惑,或者如果我的JSON对象的格式被搞砸了,我很抱歉(请告诉我,如果有任何散文让我感到困惑,我会重述)。这有道理/解决了你的问题吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21129067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档