我正在尝试将lift-json的JValue中的解析后的JSON文档转换为Casbah MongoDBObject - 有没有办法做到这一点?
我正在使用Casbah和Salat来创建我自己的Mongodb dao并且正在实现这样的getAll方法:
val dao: SalatDAO[T, ObjectId]
def getAll(): List[T] = dao.find(ref = MongoDBObject()).toList
Run Code Online (Sandbox Code Playgroud)
我想知道的是:
有没有一种简单的方法可以将List转换为MongoDBList(或BasicDBList)?
当我试图DBObject通过插入批量加载一个列表时,我得到了no implicit view available.
collection.insert(listObjects) // listObjects is a List[DBObject]
[error]Test.scala:139: No implicit view available from List[com.mongodb.casba
h.Imports.DBObject] => com.mongodb.casbah.Imports.DBObject.
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我怎么解决?
参考:
def insert [A] (docs: List[A])(implicit arg0: (A) ? DBObject) : WriteResult
我想将json转换为Salat模型.我正在使用Play 2.X Scala Json.我找不到任何格式化可空的Seq的文档.根据https://github.com/novus/salat/wiki/SupportedTypes,我不能使用Option [Seq]或Option [List].
以下json是好的,但有时"位置"可能会丢失.
{
"id": 581407,
"locations": [
{
"id": 1692,
"tag_type": "LocationTag",
"name": "san francisco",
"display_name": "San Francisco"
}]
}
Run Code Online (Sandbox Code Playgroud)
这些是类:
case class User(
var id: Int,
var locations: Seq[Tag] = Seq.empty
)
case class Tag(
id: Int,
tag_type:String,
name:String,
display_name:String
)
Run Code Online (Sandbox Code Playgroud)
如何格式化可空的"位置"?
implicit val format: Format[User] = (
(__ \ 'id).format[Int] and
(__ \ 'locations).formatNullable(Seq[Tag])
)
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Casbah和MongoDB来实现Web服务.到目前为止我没有遇到任何问题.我也在使用Scala.
但是,我只是想知道是否有比Casbah更好的东西来做很多find/findOne类型的查询.
我遇到了Rogue,这是一种基于类型安全的基于Scala的DSL,它可以使查询更容易,更易读.
所以,我想知道转移到Rogue是否有用,这样随着Web服务项目变得更大,更复杂,Rogue对查询的支持可能会有所帮助?
只是想知道我是否应该继续或转向更好的东西.
考虑在我的mongo集合中输入以下内容.
{
"id" : "_0001",
"map" : {
"foo" : 1
}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要在内部地图中添加一个条目.喜欢
{
"id" : "_0001",
"map" : {
"foo" : 1,
"bar" : 2,
}
}
Run Code Online (Sandbox Code Playgroud)
map不是,list所以我不能$push在那里使用.有没有办法在mongo中这样做.而且我也通过casbah访问数据库.如果可以,请记下casbah代码.
注意: - 地图不应该是列表
当前,我们正在使用一种类型安全的查询语言,该自定义DSL允许我们轻松编写数据库查询,这些查询将被解释并转换为Mongo查询。
我们最近从Casbah换成了新的Mongo Scala驱动程序,并改写了我们的翻译。但是,在处理可选值时遇到一些问题。
这是一个示例查询:
dao.headOption(Order.id === orderId.some)
Run Code Online (Sandbox Code Playgroud)
订单对象上存储的类型是一个选项,因此我们也将提供的ID提升为一个选项。但是,每当我尝试以以下方式呈现生成的查询以用于调试以及测试用例时:
import org.mongodb.scala.bson.{BsonDocument, codecs}
query.toBsonDocument(BsonDocument.getClass, codecs.DEFAULT_CODEC_REGISTRY)
Run Code Online (Sandbox Code Playgroud)
最终引发以下异常:
Can't find a codec for class scala.Some.
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class scala.Some.
Run Code Online (Sandbox Code Playgroud)
我不确定如何纠正此问题,或者不确定是否需要为Option实现我自己的编解码器,并且如果我这样做,我也不知道该怎么做。
任何帮助将不胜感激。先感谢您
更新资料
我已经看到我可以尝试实现编解码器接口,如下所示:
http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/
我是否需要为Option的每种可能的子类型实现它?
示例Option [Int],Option [UUID],Option [List [String]]等。
我正在通过编写一个简单的应用程序来学习MongoDB和Casbah.当我尝试将具有列表成员的对象转换为MongoDB对象时,卡住了.这是我的课
case class BorrowerRecord( name: String, checkedOut: List[BookTag]) {
require(!name.isEmpty)
require(!checkedOut.isEmpty)
}
case class BookTag (subject: Subject, bookName: String) {
require(!bookName.isEmpty)
}
case class Subject (name: String, category: Category) {
require(!name.isEmpty)
}
Run Code Online (Sandbox Code Playgroud)
类别是一个具有2个案例类实现的密封特征,我打算像"Enum"一样使用它
sealed trait Category {
def name: String
}
object Category {
case object Computing extends Category { val name = "Computing"}
case object Math extends Category { val name = "Math"}
}
Run Code Online (Sandbox Code Playgroud)
因此,BorrowerRecord的一个实例将保留一个人从图书馆检出的书籍,每本书都由BookTag对象识别.BookTag保存有关书籍,主题名称,类别等书籍的一些信息.
让我说我有一个BorrowerRecord并希望将它保存到MongoDB
val borrowOnToday = BorrowerRecord( "My Name", List( BookTag(Subject("J2EE", Category.Computing), "Head First Java"),
BookTag(Subject("Linear …Run Code Online (Sandbox Code Playgroud) 我在编译时遇到以下错误:
[error] (*:update) sbt.ResolveException: unresolved dependency: org.mongodb#casbah_2.11;2.7.4-SNAPSHOT: not found
Run Code Online (Sandbox Code Playgroud)
使用此build.sbt文件:
name := """play-scala"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayScala)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
jdbc,
anorm,
cache,
ws
)
libraryDependencies += "org.mongodb" %% "casbah" % "2.7.4-SNAPSHOT"
// For stable releases
resolvers += "Sonatype releases" at "https://oss.sonatype.org/content/repositories/releases"
// For SNAPSHOT releases
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
Run Code Online (Sandbox Code Playgroud)
我正在使用Typesafe Activator并尝试了许多Casbah版本的组合(包括版本,而不是快照)和解析器."官方"MongoDB Casbah教程中的安装说明也不起作用.有任何想法吗?
我有一个用户对象如下:
{ user: "joe", acks: ["a", "b" ] }
Run Code Online (Sandbox Code Playgroud)
我想在acks字段中添加一组字符串.这是我尝试通过一次更新来做到这一点:
def addSomeAcks(toBeAcked = Array[String])
DB.getCollection("userAcks").update(
MongoDBObject("user" -> "joe"),
$addToSet("acks") $each toBeAcked
)
}
def test() {
addSomeAcks(Set("x", "y", "z"))
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到一个嵌入式集,如下所示:
{ user: "joe", acks: ["a", "b", ["x", "y", "z" ] ] }
Run Code Online (Sandbox Code Playgroud)
但我想要的结果是:
{ user: "joe", acks: ["a", "b", "x", "y", "z" ] }
Run Code Online (Sandbox Code Playgroud)
我可以通过调用每个项目的更新来使其工作toBeAcked,有没有办法在一个调用中执行此操作?
我试图提供一个API来搜索MongoDB集合的各种标准,包括全文搜索.由于这是一个Scala项目(在Play FWIW中),我使用的是Salat,一个围绕Casbah的抽象.
以下代码工作正常:
MySalatDao
.find(MongoDBObject("$text" -> MongoDBObject("$search" -> "Vidya")), MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
Run Code Online (Sandbox Code Playgroud)
但是,我最终需要搜索多个条件并按其全文搜索分数对结果进行排序,因此我探索了Casbah的MongoDBObject 查询构建器功能(在底部).
所以我试着像这样复制上面的内容:
val builder = MongoDBObject.newBuilder
builder += "$text" -> MongoDBObject("$search" -> "Vidya")
builder += "score" -> MongoDBObject("$meta" -> "textScore")
MySalatDao
.find(a.result())
.sort(orderBy = MongoDBObject("score" -> MongoDBObject("$meta" -> "textScore")))
Run Code Online (Sandbox Code Playgroud)
这给出了以下例外:
com.mongodb.MongoException: Can't canonicalize query: BadValue must have $meta projection for all $meta sort keys
at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:214)
at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198)
at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176)
at com.mongodb.QueryResultIterator.<init>(QueryResultIterator.java:64)
at …Run Code Online (Sandbox Code Playgroud)