使用带有$ in的addToSet有多贵

时间:2017-11-09 11:31:02

标签: mongodb mongodb-query

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

我想知道是否可以在$ in选择器中使用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:我认为在短时间内我会得到数百万条记录,在最坏的情况下,100万行可以属于一个组。

* P.S.S:由于查询是在list属性上,我应该添加一个索引吗?它甚至是一种正确的方法吗?

更新

也许我使用了错误的选择器,但我只想更新其组中包含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 个答案:

答案 0 :(得分:1)

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

  • 配置的硬件(CPU,RAM等)
  • 您的部署拓扑(独立,副本集或分片群集)
  • 查询的大小($in$addToSet中有多少字词
  • 其他因素

不幸的是,这些问题没有单一,简单的答案,因为其中许多问题都与工作负载有关。此外,您发布的查询只是您需要的其他查询中的一个。

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

  • 供应不足的硬件
  • 次优索引(索引太少,索引太多,索引覆盖不够等)
  • 工作负载的次优架构设计

了解您的计划查询是否过于昂贵的唯一方法是查看他们的explain()输出,看看是否有任何明显的改进,例如{{1}的存在}阶段,与检查文档相比较少的返回文档(这意味着查询不够有针对性)。

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

一旦优化了查询,就可以将模拟工作负载放在应用程序上了。数据库,并使用以下工具监控其性能:

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