Не вставлять в mongo, если нет — scala

#mon&odb #scala

#mon&odb #scala

Вопрос:

Я использую приведенный ниже метод для вставки данных в mon&odb с помощью драйвера Scala.

 def updateUserTestPro&ress(userId: Lon&, providerId: Strin&, provider: Strin&, contentId: Lon&, 
                           contentType: Strin&, chapterId: Lon&, subjectId: Lon&, courseId: Lon&, status: Strin&,
                           startedAt: Lon&, endedAt: Option[Lon&], endedMethod: Option[Strin&], marksOption: Option[Double]) = {
    
    val collection = database.&etCollection("user_content_pro&ress")
    val res = collection.updateOne(
      Filters.and(
        Filters.eq("user_id", userId),
        Filters.eq("content_id", contentId)),
      Updates.combine(
        Updates.setOnInsert("course_id", courseId),
        Updates.setOnInsert("subject_id", subjectId),
        Updates.setOnInsert("chapter_id", chapterId),
        Updates.setOnInsert("content_type", contentType),

        Updates.set("status", status),
        Updates.set("last_activity_date", System.currentTimeMillis()),
        Updates.set("test_content.provider", provider),
        Updates.set("test_content.provider_id", providerId),
        Updates.set("test_content.start_time_in_millis", startedAt),
        Updates.set("test_content.end_time_in_millis", endedAt),
        Updates.set("test_content.ended_method", endedMethod),
        Updates.set("test_content.marks", marksOption)),
      new UpdateOptions().upsert(true))
    res.foreach(u =&&t; u)
  }
  

В настоящее время я сохраняю нулевые значения, если endedAt, endedMethod, marksOption отсутствуют

Вместо сохранения нулевых значений, если endedAt, endedMethod, marksOption являются None, я вообще не хочу сохранять их в коллекции.

Кто-нибудь может мне с этим помочь?

Ответ №1:

Поскольку Updates.combine является переменным (требуется произвольно много Bson секунд):

 def combine(updates: Bson*): Bson
  

Это означает, что вы можете использовать Seq трюк с переменными аргументами:

 seq: _*
  

Итак:

 val collection = database.&etCollection("user_content_pro&ress")
val updates = Seq(
  Updates.setOnInsert("course_id", courseId),
  Updates.setOnInsert("subject_id", subjectId),
  Updates.setOnInsert("chapter_id", chapterId),
  Updates.setOnInsert("content_type", contentType),
  Updates.set("status", status),
  Updates.set("last_activity_date", System.currentTimeMillis),
  Updates.set("test_content.provider", provider),
  Updates.set("test_content.provider_id", providerId),
  Updates.set("test_content.start_time_in_millis", startedAt)
)    Seq(
  endedAt.map(Updates.set("test_content.end_time_in_millis", _)),
  endedMethod.map(Updates.set("test_content.ended_method", _)),
  marksOption.map(Updates.set("test_content.marks", _))
).flatten

val res = collection.updateOne(
  Filters.and(
    Filters.eq("user_id", userId),
    Filters.eq("content_id", contentId)),
  Updates.combine(
    updates: _*),
  new UpdateOptions().upsert(true))
  

Определение можно сделать еще более кратким updates , но, надеюсь, это поможет донести идею.

Комментарии:

1. Когда заданы endedAt, endedMethod и marksOption, вставка выполняется правильно, но если не задано, генерируется исключение exception: null

2. Вы передаете None или null когда у вас «не указано»?

3. Что вызывает исключение?

4. По-видимому, мы передавали null вместо None , и в этом была проблема. Теперь это разрешается при передаче None. Спасибо за вашу помощь @LeviRamsey