0

私は現在、reactivemongo と mongodb をいじっていますが、処理方法がわからないものを見つけました。

ケースクラスUserInfoがあるとしましょう:

case class UserInfo(override var _id: Option[BSONObjectID] = None,
                    firstName: String,
                    lastName: Option[String],
                    email: Option[String],
                    mobile: Option[String],
                    fbId: Option[String],
                    fbPublish: Option[Boolean]) {    
}

このオブジェクトはユーザーを表します。ユーザーには常に firstName があり、電子メールまたは携帯電話番号を持っている場合もあります。

object UserInfo {

  import play.modules.reactivemongo.json.BSONFormats._

  implicit val userInfoReads: Reads[UserInfo] = (
    (__ \ "_id").read[Option[BSONObjectID]] and
    (__ \ "firstName").read[String] and
      (__ \ "lastName").read[Option[String]] and
      (__ \ "email").read[Option[String]] and
      (__ \ "mobile").read[Option[String]] and
      (__ \ "fbId").read[Option[String]] and
      (__ \ "fbPublish").read[Option[Boolean]]
    )(UserInfo.apply _)

  implicit val userInfoWrites: Writes[UserInfo] = (
    (__ \ "_id").write[Option[BSONObjectID]] and
    (__ \ "firstName").write[String] and
      (__ \ "lastName").write[Option[String]] and
      (__ \ "email").write[Option[String]] and
      (__ \ "mobile").write[Option[String]] and
      (__ \ "fbId").write[Option[String]] and
      (__ \ "fbPublish").write[Option[Boolean]]
    )(unlift(UserInfo.unapply))    
}

UserInfo コンパニオン オブジェクトで、UserInfo の書き込みと読み取りを定義します。このドキュメントを挿入すると、UserInfo が Mongo インスタンスに保存され、None のフィールドは null として保存されます。多くのユーザーがいるので、firstName + emailにインデックスを設定し、 firstName + mobileに 2 番目のインデックスを設定したいと思います。

ensureIndex(List("firstName" -> IndexType.Ascending, "email"-> IndexType.Ascending), unique = true, sparse = true)
ensureIndex(List("firstName" -> IndexType.Ascending, "mobile"-> IndexType.Ascending), unique = true, sparse = true)

firstName と email を使用して UserInfo を挿入します。残りのフィールドはなしです。

そして今、私がどのように処理するかわからない部分が来ます. None は null に書き込むため、null 値は userinfos のコレクションに保存されます。同じ firstName と email を挿入しようとしましたが、これは失敗するはずですが、間違った理由で失敗します。私の場合の理由は、jakob と null に対して作成されたインデックスがあるためです。

DB operation failed: [message=DatabaseException['E11000 duplicate key error index: userinfos.$userInfo.userInfo.mobile_1  dup key: { : "jakob", : null }' (code = 11000)]]

私が理解しているように、スパースは欠損値に対してのみ機能し、null は値であるため、この場合スパースは機能しません。では、これをどのように処理すればよいでしょうか。null の可能性がある値でインデックスを作成することは可能ですか? または、 None 値を他の方法で処理する必要がありますか? None が空の [T] パラメータを書き込むように、書き込みを変更できるかもしれません。これを処理するMongoDBの方法は何ですか?

4

0 に答える 0