mongodb - MongoDB Scala 驱动程序推送到嵌套数组
问题描述
我在使用 Scala 中的 Mongo 正确附加到嵌套数组时遇到了一些麻烦。我在 Node.js 中多次执行相同的操作,但由于某种原因,我无法将其转换为 Scala。
这是主要的“模式”:
case class Band(
_id: ObjectId,
name: String,
username: String,
email: String,
path: String,
tours: List[Tour],
merchSets: List[MerchSet],
facebook: Option[String],
twitter: Option[String],
youtube: Option[String],
instagram: Option[String],
website: Option[String]
)
object Band {
def apply(
_id: ObjectId,
name: String,
username: String,
email: String,
path: String,
tours: List[Tour],
merchSets: List[MerchSet],
facebook: Option[String],
twitter: Option[String],
youtube: Option[String],
instagram: Option[String],
website: Option[String]
): Band = new Band(_id,
name, username, email, path, tours, merchSets, facebook, twitter,
youtube, instagram, website)
val bandCodecRegistry: CodecRegistry =
fromRegistries(fromProviders(classOf[Band]), DEFAULT_CODEC_REGISTRY)
}
正如你所看到的,这个定义有一个旅游列表,其中一个旅游被定义为:
case class Tour(_id: ObjectId,
name: String,
shows: List[Show],
items: List[Item],
region: String,
default_merchset : Option[MerchSet]
)
object Tour{
def apply(_id: ObjectId,
name: String,
shows: List[Show],
items: List[Item],
region: String,
default_merchset: Option[MerchSet]
): Tour = new Tour(_id, name, shows, items, region, default_merchset)
val tourCodecRegistry : CodecRegistry =
fromRegistries(fromProviders(classOf[Tour]), DEFAULT_CODEC_REGISTRY)
}
我正在尝试将一个项目推送到项目集合中,如果它不存在,那么每当创建一个新项目时。
基本上,端点接收一个乐队 id、一个旅游名称和一组用于创建和推送项目的表单参数。
GOAL:查询需要从对应的tours集合中找到正确的band和正确的tour,并将创建的item添加到对应的tour.items
我在 Node.js 中执行此操作的方式如下:
var query = {"_id": id, "tours.name": name}
Band.findOneAndUpdate(
query,
{$push: {"tours.$.items": item}}
)
但这在 Scala 中是行不通的。而且我完全没有错误。尽管数据库中没有任何变化,但订阅达到了 OnComplete 案例。OnNext 案例没有受到打击。不知何故,查询完成没有错误,也没有成功......
这是我目前拥有的:
val add = MongoDataBaseConnector.bands.findOneAndUpdate(and(equal("_id", id),
equal("tours.name", tour_name)),
push("tours.items", request.toDomain))
我曾尝试在中间使用 $ 运算符并使用 addToSet 但它们没有任何区别。
解决这个问题的正确方法是什么?
注意:这是官方的 scala 驱动程序,而不是 casbah。如何在 casbah 中做到这一点已被多次回答。
解决方案
原来我忘了将 id 转换为 ObjectId ...下面的查询有效
def addTourSpecificMerch(request: NewItemRequest, id: ObjectId, name: String): Unit = {
val tour_name = name.replace("%20", " ")
val add = MongoDataBaseConnector.bands.findOneAndUpdate(and(equal("_id", id),
equal("tours.name", tour_name)),
addToSet("tours.$.items", request.toDomain))
add.subscribe(new Observer[Band] {
override def onNext(result: Band): Unit = println(s"onNext: $result")
override def onError(e: Throwable): Unit = println(s"onError: $e")
override def onComplete(): Unit = println("onComplete")
})
}
推荐阅读
- azure-devops - 如何在部署新版本之前检查以前的版本是否已完成
- azure - 如何以编程方式将 Azure AD 用户添加到 Azure DevOps 组织
- vba - 使用 CATIA VBA 测量两个对象之间的距离
- javascript - Angular 8 - IE11 有一个“Uncaught in Promise 错误”
- php - 将 MySQL 本地主机更新为服务器 MySQL
- reactjs - “TypeError: Object(...) is not a function” react-redux-firebase
- css - Safari 问题中的动画文本对齐更改
- c - 如何摆脱性能中的“未知”部分
- php - 在页面模板中使用 `new WP_Query();` 的 Wordpress 分页问题
- c++ - 使用 C++ 智能指针构建带有父指针的树