代码之家  ›  专栏  ›  技术社区  ›  Ashkan S Govindaraju

在中使用addToSet和$有多贵

  •  0
  • Ashkan S Govindaraju  · 技术社区  · 8 年前

    这是我的第一个MongoDB项目,我还在系统的设计阶段,所以我想知道我的设计是否正确。

    我想知道是否可以在选择器中使用addToSet方法和$,如果可以的话,成本有多高?

    例如,我有一些数据如下:

    {
        {
         Id:1,
         Groups: ["Group1", "Group2"],
         Events:["event1"]
        },
        {
         Id:2,
         Groups: ["Group2" ],
         Events:["event2"]
        },
        ,
        {
         Id:3,
         Groups: ["Group1","Group3" ],
         Events:["event1"]
        },
    }
    

    可以这样称呼它吗?它有多贵?

    db.test.update(
      { Groups: { $in: ["Group1"] } },
       { $addToSet: {Events: [ "newEvent1", "newEvent2" ] } }
    )
    
    • P、 S:我假设在很短的时间内我会有数百万条记录,在最坏的情况下,一百万行可以属于一个组。

    *P、 既然查询是在一个列表属性上,我应该添加一个索引还是什么?这是一条正确的路吗?

    使现代化

    也许我使用了错误的选择器,但我只想更新组中包含group1的行。因此,预期结果如下:

    {
        {
         Id:1,
         Groups: ["Group1", "Group2"],
         Events:["event1", "newEvent1", "newEvent2"]
        },
        {
         Id:2,
         Groups: ["Group2" ],
         Events:["event2"]
        },
        ,
        {
         Id:3,
         Groups: ["Group1","Group3" ],
         Events:["event1","newEvent1", "newEvent2"]
        },
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   kevinadi    8 年前

    “昂贵”是一个相对术语,还取决于其他因素,例如:

    • 配置的硬件(CPU、RAM等)
    • 部署拓扑(独立、副本集或分片集群)
    • 查询将有多大(在 $in 和 $addToSet )
    • 其他因素

    不幸的是,这些问题没有一个简单的答案,因为其中许多问题非常依赖于工作量。此外,你发布的查询肯定只是你需要的众多其他查询中的一个。

    话虽如此,MongoDB中的慢速查询通常是由以下原因引起的:

    • 配置不足的硬件
    • 次优索引(索引太少、太多、索引没有足够的覆盖率等)

    要知道您计划的查询是否过于昂贵,唯一的方法是查看他们的 explain() 并查看是否有任何明显的改进,例如 COLLSCAN 与检查过的文档相比,返回的文档数量较少(这意味着查询的针对性不够)。

    您可能会发现这些链接通常包含有关优化的足够信息:

    一旦查询得到优化,就可以在应用程序上添加模拟工作负载了;并使用以下工具监控其性能:

    并确认您为预期的工作负载配置了足够的硬件。

    推荐文章