代码之家  ›  专栏  ›  技术社区  ›  tonyhb

用未知修改字段更新MongoDB集合的最佳实践

  •  3
  • tonyhb  · 技术社区  · 15 年前

    所以我正在使用php和mongodb构建一个应用程序,它在读写方面都有相当大的流量。几个月后,每秒应该有2500次读操作和每秒200次写操作(但不确定这在流量方面与其他操作相比到底有多高)。

    我有点好奇在更新集合时要做什么;文档示例显示了一个shell,它更新了一个特定的集合字段,但没有解释当集合中的任意数量的字段可能被更改时会发生什么。

    例如,假设我有一个用户集合(非常简单的示例):

    user = {
      _id     :  MongoId(...),
      name    : 'User One',
      email   : 'email@address.com',
      company : 'Company',
      ...
    }
    

    我们在表单中显示所有可编辑字段,但用户只更改其电子邮件地址。

    严格地说,就性能而言,最好将原始值存储在隐藏的输入中,以便在PHP中进行比较,然后构建特定于更新的查询吗?

    还是应该替换所有可编辑字段?

    它将是一个包含对象和数组的集合,而不是这里显示的简单集合。

    我知道优化是需要的,但我也希望和MongoDB一起养成好习惯。

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  3
  •   nearlymonolith    15 年前

    您可能会检索整个对象以显示可编辑表单-我假设您将在此处显示当前名称、电子邮件等,并允许他们编辑和提交新版本。这意味着您可以检查具体的更改和更新内容,而不是每次都上载和替换整个对象。

    我建议使用优化的更新操作: "MongoDB Updating" . 这样,您就可以执行更优化的就地操作,而不是每次编辑特定字段时都替换整个对象。你可能主要看 $set , $addToSet ,并且(如果您处理的是许多嵌套对象, $ 位置运算符。

    来自文档:

    修饰符操作

    在更新现有值时,修饰符操作是非常有效和有用的;例如,修饰符操作对于增加一个数字非常有用。[ 还有其他更复杂的事情 ]

    修饰符更新具有避免查询和返回对象所涉及的延迟的优点。修改器更新还具有操作原子性和极少的网络数据传输。

    如果您对实现某个特定操作有更具体的问题,请直接问。

    推荐文章