#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