草庐IT

mongodb - 这种带有嵌套子文档的模式会降低性能吗?

coder 2023-10-27 原文

我正在构建一个基于浏览器的回合制 RPG,并构建了一个数据模型,如下所示。当玩家进行战斗时,会读取和写入'souls'和'items'子文档(数组),并进一步读取'skills'和'character'子文档。我想象每个数组都包含 1-30 个子文档

为了提高性能,我尝试将几乎所有逻辑都包含在一个集合中,但我是否在嵌套方面走得太远了?

我听说 MongoDB/MeteorJS 在使用嵌套数组时表现不佳,想就此数据模型是否可行征求一些意见?

    email: 'a@test'
    password: 'f321'
    profile:
      character: 
        _id: 'c001'
        location: 'Isenheim'
        name: 'Ugyr'
        race: 'human'
        level: 1
        experience: 1
        maxHealth: 10
        curHealth: 10
        curAp: 10
        maxAp: 10
        flagged: false
        gold: 0
        souls: [
          _id: 'S001'
          name: 'Hound'
          race: 'beast'
          cost: 5
          active: false
          maxHealth: 5
          curHealth: 5
          maxAp: 6
          curAp: 6
          skills: [
            name: 'Bite'
            damage: 1
            cost: 2
          ,
            name: 'Shred'
            damage: 2
            cost: 4
            effects: 
              name: 'Bleeding'
              duration: 2
              type: 'subtractive'
              stats: ['curHealth']
              value: 1
          ]
        ]
        skills: [
          name: 'Slash'
          type: 'direct'
          damage: 2
          cost: 2
        ,
          name: 'Pierce'
          type: 'direct'
          damage: 3
          cost: 3
        ,
          name: 'Throwing Knives'
          type: 'direct'
          damage: 1
          cost: 1
        ]
        items: 
          equiped: 
            weapon:
              name: 'Rusty Knife' 
              attack: 2
            shield: null

          inventory: [
            name: 'Potion'
            type: 'consumable'
            effects:
              type: 'additive'
              stats: ['curHealth', 'curAp']
              value: 3
            amount: 500
          ,
            name: 'Minor Soul Stone'
            type: 'consumable'
            amount: 500
            effects: [
              type: 'additive'
              stats: ['curAp']
              value: 2
            ,
              type: 'subtractive'
              stats: ['curHealth']
              value: 1
            ]
          ,
            name: 'Health Potion'
            type: 'consumable'
            amount: 100
            effects: [
              type: 'additive'
              stackable: false
              stats: ['curHealth']
              value: 1
              duration: 2
            ]
          ]
          conditions: [

          ]

最佳答案

是的,您在嵌套方面走得太远了。

Meteor DDP 仅发送第一级属性的更改/差异。因此,对 soulsitems 的任何更改都将等同于再次发送整个 profile

我建议将 charactersoulsitems 一起分成一个单独的集合。

然后,将所有这些 userId 反规范化并一次性发布,例如:

Meteor.publish("my-characters",function(){
  if (this.userId == null){
    return;
  }
  return [
    characters.find({"userId": this.userId}),
    characterSouls.find({"userId": this.userId}),
    characterItems.find({"userId": this.userId})
  ];
});

这可能会在发布游标和在线数据方面提供最佳性能。

此外,不要忘记在 userId 上建立索引:

characters._ensureIndex({userId: 1});
characterSouls._ensureIndex({userId: 1});
characterItems._ensureIndex({userId: 1});

关于mongodb - 这种带有嵌套子文档的模式会降低性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25589796/

有关mongodb - 这种带有嵌套子文档的模式会降低性能吗?的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  5. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  6. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  7. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  8. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  9. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  10. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

随机推荐