私は現在、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の方法は何ですか?