Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于mongoDB的JSON去氧

用于mongoDB的JSON去氧
EN

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "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
运行
AI代码解释
复制
{
  {
    "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-23 19:14:07

给你。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  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
运行
AI代码解释
复制
      { 
        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
运行
AI代码解释
复制
//data model
{
    "name": "Limited Edition Alpha",
    "code": "LEA",
    "releaseDate": "1993-08-05",
    "border": "black",
    "type": "core",
    "_id": $SOME_MONGO_ID_HERE
}

收藏2,卡片:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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
运行
AI代码解释
复制
{
  _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
运行
AI代码解释
复制
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

复制
相关文章
为什么我总写 Bug ?
写代码的过程中,难免会出现各种各样的 Bug。但实际上,很多 Bug 产生的原因是类似的。于是我总结了一些自己学编程时写 Bug 的诱因,希望大家引以为戒,在以后写代码的时候能更多注意。
程序员鱼皮
2021/09/15
7000
高数 下总复习 完结
参数方程–>曲线积分 曲线积分 第二类曲线积分 (对面积的) 此时可以不用 上限大于下限 三 格林公式 及其应用 2 .积分与路径无关 如果不封闭 曲面积分 对于 dyd
CaesarChang张旭
2021/01/26
4090
高数 下总复习  完结
缺陷定位 | 测试发现了Bug,还要分析定位Bug?(一)
hello今天分享的内容,可能会有很多朋友持不同观点,或被很多同行朋友diss,不过没关系,即使被喷被diss,我依然会坚持我的观点,把最真实的干货分享给大家,希望得到支持。
王大力测试进阶之路
2022/03/14
6350
PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
BUG1 在使用NLLLoss()激活函数时,NLLLoss用来做n类分类的,一般最后一层网络为LogSoftmax,如果其他的则需要使用CrossEntropyLoss。其使用格式为:loss(m(
zenRRan
2018/04/10
2.8K0
PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
一个BUG的发现、定位和解决
前言 在iOS 11发布之后,出现了一系列适配相关的问题,UIScrollView在pagingEnabled=YES时滑动手势不灵敏,UITableView的滑动删除功能变动,UIImagePickerViewController的取消按钮点击区域变小等,本文介绍其中一个UIAlertView问题,分享其发现、定位和解决。 正文 1、问题产生 问题的最初,是iOS 11正式版发布后不久,测试的同学提了一个iOS 11相关的BUG,表现是:在直播间内发送聊天信息,如果被禁言,会弹出“被禁言”提示,键盘收回去
落影
2018/04/27
1.5K0
一个BUG的发现、定位和解决
发现了一个vscode的bug
被一个BUG折磨了3个小时。我知道引起这个BUG的原因,是因为项目中某些配置文件中配置的程序包引用路径出错了,要解决这个问题很简单,只需要将这些配置文件中错误的程序包引用路径找出来并修改之就可以了。
用户1608022
2018/08/01
5870
BUG赏金 | 当我发现iFrame注入时的利用
iFrame注入是一种非常常见的跨站脚本攻击。它包括已插入到网页或文章内容的一个或多个iframe代码,或一般下载一个可执行程序或进行其他动作使网站访客的电脑妥协。在最好的情况下,谷歌可能会标注该网站“恶意”。最糟糕的情况是,站点所有者和访问者最终使用了受恶意软件感染的计算机。
Timeline Sec
2019/12/26
1.3K0
根据原理撸一个带bug的PromiKit
之前我们说了PromiseKit今天就带领大家来分析一下这个PromiseKit,之后我们再根据PromiseKit的思想剥茧抽丝的简易的撸一个微型的PromiseKit。
大话swift
2019/07/03
6620
根据原理撸一个带bug的PromiKit
只要发现bug,就必须要提吗
大家好,我是乐天派阿常,一位有着8年管理经验的软件测试人,今天我和大家分享职场思考,发现bug是否要记录。
程序媛淼淼
2022/09/01
2830
解Bug之路-Druid的Bug 原
笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug。现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少踩点坑。
无毁的湖光-Al
2018/08/14
1.1K0
解Bug之路-Druid的Bug                                                                       原
探索TiDB Lightning的源码来解决发现的bug
上一篇《记一次简单的Oracle离线数据迁移至TiDB过程》说到在使用Lightning导入csv文件到TiDB的时候发现了一个bug,是这样一个过程。
HOHO
2022/05/09
4140
探索TiDB Lightning的源码来解决发现的bug
万万没想到,这都能发现 Bug?!
大家好,我是鱼皮,昨天工作中遇到一个挺好玩儿的小 Bug,和大家分享下,小白可懂~
程序员鱼皮
2021/12/15
4040
谷歌源生bug发现与解决记录
1、进入拨号界面,输入 *#*#4636#*#* ,然后会进入手机测试界面。 2、点击第三栏 Wi-Fi information 。 3、进入Wi-Fi information 界面后,点击第一栏 Wi-Fi API 。 4、进入Wi-Fi API 界面后,点击 enableNetwork 。这时会弹出一个输入栏,如果你输入为空或者输入为非数字,如何点击 OK ,连续操作俩次,就会显示 Settings keeps stopping。
用户7557625
2020/07/15
5300
【改BUG】项目遇到的奇葩bug
今天,我的下级代理联系我说,我们的平台,应用服务批量导入后,用户密码含有“0”的都不显示,例如密码是“07121239”但是平台只显示“7121239”,今天做了下排查,本文仅记录一下今天排查的经历
德宏大魔王
2023/08/08
1970
【改BUG】项目遇到的奇葩bug
JDK 的这3个bug,你发现了吗?
如果两个变量中间隔了比较长的其它代码,很可能会导致开发人员将两者混淆,导致逻辑认知错误,从而写出或改出有问题的代码。
用户5224393
2019/06/18
5430
你能发现这段 Python 代码中的 bug 吗?
原文链接:https://dwrodri.gitlab.io/can-you-spot-the-bug-in-this-python-code/
腾讯云 CODING
2023/08/18
1370
你能发现这段 Python 代码中的 bug 吗?
为什么程序员发现不了自己的BUG?
最近在朋友圈流行了这样的一个小学数学题,当然结果是“出乎意料”。看似简单的结果,儿童一般能够做对,而大人却几乎很少有人做对,分析下来,原因无非是惯性思维下的粗心导致的完全错误。今天我们就一起来分析下思考过程。
编程范 源代码公司
2018/08/03
3570
为什么程序员发现不了自己的BUG?
伪随机数算法_伪随机数预测工具
转载内容,有更改,感谢原作者(http://www.cnblogs.com/softidea/p/5824240.html#3697214)
全栈程序员站长
2022/09/16
1K0
AI找Bug,一键快速预测
在程序开发中,程序员每天都要和 Bug 打交道,对新手程序员而言,debug 是一件非常让人头疼的事情。好不容易写完一段代码,一运行,全是红色,找了好几圈,被几个符号累瞎了眼。
AI科技大本营
2019/05/06
8880
AI找Bug,一键快速预测
点击加载更多

相似问题

SQL -计算每天打开的总bug数

54

rangeOfUnit每月返回“”数周(iOS7 bug)

13

C# RichTextBox发现() Bug?

13

在XPages中发现的Bug

21

FindBugs没有显示发现的bug

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文