我正在尝试编写一个查询,通过对象ID与Casbah查找,它似乎微不足道但是......我找不到.
我试过这个:
def get(id: Option[String]): User = {
val mongoDB : MongoDB = MongoConnection().apply("test")
val mongoColl : MongoCollection = mongoDB.apply("users")
val objectId = id.getOrElse().asInstanceOf[String]
val o : DBObject = MongoDBObject("_id" -> objectId)
val u = mongoColl.findOne(o)
val user = new User()
for(x <- u){
user.id = x.getAs[String]("_id")
user.username = x.getAs[String]("username")
user.password = x.getAs[String]("password")
}
user
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
def get(id: Option[String]): User = {
val mongoDB : MongoDB = MongoConnection().apply("test")
val mongoColl : MongoCollection = mongoDB.apply("users")
val objectId = "ObjectId(\"" +id.getOrElse().asInstanceOf[String] …
Run Code Online (Sandbox Code Playgroud) 我尝试通过Casbah查询MongoDB的字段是一个带有正则表达式的字符串数组.
例如:
我有一个带有ips列表的Maschine,它们在字段ips中以字符串形式存储.现在我想搜索所有具有子网192.168的计算机.
对我来说,我看起来我无法查询应用于每个条目的regexp的数组,如果其中一个条目匹配,则返回该机器.
有什么方法可以进行这样的查询吗?
- 修正了
谢谢你的帮助.
现在一切都有效.最后我需要解决Casbah的一个限制,因为我需要加入查询$或者Casbah抱怨错误地使用regexp.
我的RegExp Array查询的最终代码包含另外一个字段:
val regexp = ".*" + parameter + ".*"
val nameQ = MongoDBObject("serverName" -> regexp.r)
val ipsQ = MongoDBObject("ips" -> regexp.r)
val bldr = MongoDBList.newBuilder
bldr += ipsQ
bldr += nameQ
val query = MongoDBObject("$or" -> bldr.result.asDBObject)
val result = find(query)
Run Code Online (Sandbox Code Playgroud)
它不是最好的代码,需要修复参数的字符串连接.但它的工作原理:)
如何使用正则表达式Collection#find(/* HERE */)
:
val coll = MongoConnection()("foo")("bar")
for(x <- coll.find("name" -> ".*son$".r)) {
// some operations...
}
Run Code Online (Sandbox Code Playgroud) 我有一个已经持久存储到数据库中的BasicDBList.我现在正在读取数据并尝试将列表转换为不可变的scala列表,如下所示:
val collection = mongoFactory.getCollection("tokens")
val appId = MongoDBObject("appId" -> id)
val appDBObject = collection.findOne(appId)
val scope: List[String] = appDBObject.get("scope").asInstanceOf[List[String]]
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个类转换异常,说不可能将BasicDBList转换为Scala不可变列表.
我尝试了各种组合,例如转换为地图等.似乎没有任何效果.
好的,这是另一个关于Casbah和MongoDB基础知识的问题.从数据库中检索DBObject后,如何从中提取某些数据?我知道有DBObject.get()
方法,返回java.lang.Object
.我是否必须这样做,然后将数据转换为所需的类型?我不确定这是最好的方法吗...任何人都可以建议如何更好地做到这一点?
更新:
最后,我采用了手动处理所有内容的方式.由于案例类限制,我不使用Salat,因为不建议将案例类用于生孩子,这需要架构重新安排.然而,答案被标记为最佳答案,因为它在大多数情况下都有效,而且这里没有其他更一般的答案.
我正在Scala开发一个全新的项目.它只是一堆CRUD操作的应用程序,但是,由于一些古怪的要求,Play2或Lift不符合要求,所以我将从头开始开发应用程序.这意味着Anorm或ScalaQuery成为数据库集成的不太明显的选择,让我有一个问题:是时候尝试新的东西了吗?
我过去的技术堆栈主要包括Java和PostgreSQL,我有ORM和纯SQL的经验.像MongoDB这样的NoSQL数据库管理系统是典型RDBMS的良好替代品,还是特殊情况的应用程序数据存储?此外,数据库的选择如何影响更大的Scala系统设计(如果有的话)?例如,您使用类似JSON的接口与数据库进行通信,以及Web和REST服务之间的JSON这一事实并不意味着如果中间的所有内容都成为Scala对象,或者它是什么?
我基本上要求有人从关系数据库转移到对象/文档类型数据库,特别是使用Scala.我知道即将发布的SLICK承诺提供良好的RDBMS集成.那么,如果像TypeSafe这样的公司决定在TypeSafe堆栈中建立RDBMS集成部分,那么我将使用Casbah集成到MongoDB上游吗?
如果这个问题看起来有点含糊,请道歉.我希望有正确见解或经验的人能够提供帮助.
更新:
不向SLICK添加链接的道歉(这是相当新的).开始:
更新2:
对于技术我个人的第一场胜利通常为开发人员的生产力 -这相当于轻巧简单:快速学习,容易维护,没有魔法
注意:我意识到在SO上有一个类似的问题,但是它谈到了Casbah的旧版本,而且,答案中解释的行为不是我所看到的!
我的印象是Casbah的MongoClient处理连接池.然而,在我的进程中做lsof我看到一个庞大且越来越多的mongodb连接,这让我怀疑这个池真的存在.
基本上,这就是我正在做的事情:
class MongodbDataStore {
val mongoClient = MongoClient("host",27017)("database")
var getObject1(): Object1 = {
val collection = mongoClient("object1Collection")
...
}
var getObject2(): Object2 = {
val collection = mongoClient("object2Collection")
...
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我从不关闭MongoClient.
我应该在每次查询后关闭它吗?实现我自己的池?然后怎样呢?
谢谢
卡斯巴有一个教程:
http://api.mongodb.org/scala/casbah/current/tutorial.html
但我发现很难按照教程,因为我还在学习Scala.
所有我想知道如何使用Casbah进行简单的CRUD操作,然后再开始更先进.
鉴于以下域名模型:
class Hotel (var name: String, var stars: Int, val address: Address)
class Address(var street:String, var city: String, var postCode: String)
val address = new Address(street = "1234 st", city = "edmond", postCode = "1232234", country = "USA" )
val hotel = new Hotel(name = "Super Nice", stars = 4, address = address)
val address2 = new Address(street = "main st", city = "edmond", postCode = "1232234", country = "USA" )
val hotel2 = new Hotel(name …
Run Code Online (Sandbox Code Playgroud) 我知道MongoDB中的对象可以包含多个级别的数据(就像JSON对象的方式一样).但是,Casbah驱动程序教程仅涵盖"平面"对象的创建,其中只有一个级别的数据.如何使用Casbah创建和处理多级对象?
我正在使用scala开发一个play框架项目,其中我希望使用MongoDb作为数据存储来使用Scala域类(甚至是Java域类).
我希望在每天服务数十万甚至数百万的请求时获得最佳性能.
由于scala语言和Play框架都是按月添加新功能,因此问答框架1.2.2中提到的模块的最新生产版本,scala 0.9.1+和scala语言2.8+的最佳答案是什么? ?