【问题标题】:Is it efficient to use MongoDB partial index feature?使用 MongoDB 部分索引功能是否有效?
【发布时间】:2020-05-20 13:35:45
【问题描述】:

我将创建注册、登录功能。 用户可以使用电子邮件或手机号码进行注册,因为我需要在这两个字段上都有索引,所以我在想什么是实现良好性能和正确方法的最佳实践。

用户可以使用手机或电子邮件注册,在注册时,这些字段之一将为空,并且字段必须是唯一的。 什么是最好的方法。

【问题讨论】:

    标签: mongodb indexing database-design schema


    【解决方案1】:

    正如您提供的详细信息,可能存在三种数据情况:

    1. 收藏有电话号码,但没有电子邮件
    2. 收藏有电子邮件但没有电话号码
    3. collection 可以有两个字段 phone number 作为 email。

    假设用户可以创建两个帐户,一个使用电话号码,另一个使用电子邮件。

    而且,完全取决于用户是在使用电话号码创建帐户后提供电子邮件,还是在使用电子邮件创建帐户后提供电话号码。

    所以,我认为最好继续使用“phoneNumber”和“email”这两个字段创建复合索引。 因为,这将涵盖所有三种集合情况。

        db.collection.createIndex( { phone:1, email: 1 } )
    

    上面将创建索引,同时使用这两个字段。

    【讨论】:

      【解决方案2】:

      一般来说,用户集合的结构是这样的:

      用户:

      _id
      fullname
      username
      email
      phone
      etc.
      

      注册详情用户详情分开将有助于根据其功能管理数据。因此,引入一个特定于注册的字段。用户的文档可以具有以下形状的 registration 字段:

      registration: { email: "myname@mymail.com" }
      -or-
      registration: { phone: "999-888-1234" }
      

      这将允许注册电话或电子邮件是唯一的。您可以分别为这两个字段创建唯一索引。为此,请使用partial indexing。例如:

      db.user.createIndex(
         { "registration.email": 1 },
         { unique: true, partialFilterExpression: { "registration.email": { $exists: true } } }
      )
      
      db.user.createIndex(
         { "registration.phone": 1 },
         { unique: true, partialFilterExpression: { "registration.phone": { $exists: true } } }
      )
      

      这也可能意味着电话或电子邮件等某些数据的重复。应用程序需要根据功能来处理它。

      要考虑的选项:

      • 使用可用的注册电话或邮箱(以及注册邮箱 或电话无法更改)。
      • 将用户电话和电子邮件字段与已注册的字段分开 电话或电子邮件(要问的问题是:“如果用户想要 更改用户电子邮件或用户电话?”)。

      【讨论】:

      • 谢谢@parsad_,我正在考虑您提供的这个解决方案,但是使用部分索引可以吗?我读了很多,这可能会带来一些性能问题,即大量数据。有这方面的经验吗?
      • “我读了很多,这可能会带来一些性能问题是大量数据......”你是从哪里知道的?你有来源或链接吗?
      • 一般来说,索引用于快速搜索和排序。如果您正在寻找查询的性能,那么索引是您的最佳选择。正确使用索引时,总能得到想要的结果。根据使用标准,有不同种类的索引。
      【解决方案3】:

      即使其中一个字段为空,您也可以继续使用sparse 索引在这两个键上分别创建索引。但是集合上的稀疏索引不能返回完整的结果,你必须小心它的使用。

      另一种方法是创建一个像“primary_login_key”这样的字段,它可以是电子邮件或手机号码。这允许您拥有一个非稀疏索引。但是,如果用户想要将多个方法连接到他的配置文件,这不会像将来那样扩展,无论如何您都必须在它们上创建这些键和索引。

      【讨论】:

      • 谢谢@Arbaz,我不想使用稀疏索引,因为 MongoDB 建议最好使用 partialIndex 而不是稀疏索引,但我的问题是,使用他们?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多