mongodb 的 scala 驱动 -> casbah

原创 2015年07月09日 22:35:00

github地址: github.com/1178615156/service

要引的包: “org.mongodb” %% “casbah” % “2.8.1”
web 框架:play
随手封装了下
基本思路:在MongoDao 中实现 镇上查改功能,需要一个隐式参数 用于将 entity 与 DBObject 进行互转
代码
MongoDao—

/**
 * 基于casbah 实现的一个mongo dao
 * @tparam _Value entity value type
 */
abstract class MongoDao[_Value:ClassTag]
{
  type Value =_Value
  import com.mongodb.casbah.Imports._

  /**
   * 链接 mongo 
   */
  lazy val mongoClient  = MongoClient(MongoClientURI.apply(mongoUrl))
  lazy val db           = mongoClient(dbName)
  lazy val collection   = db.getCollection(collectionName)

  //子类可重写
  def mongoUrl:String="mongodb://localhost:27017"
  //子类可重写
  def dbName:String="testdb"

  //在mongo中对应的集合名
  //由子类重写
  def collectionName:String

  /**
   * 查询功能
   * @param mongoDBObject 查询条件
   * @return list 如果 无数据则 list 为 Nil
   */
  def find(mongoDBObject:MongoDBObject=MongoDBObject.empty,
           findParameter: FindParameter=FindParameter.default
            )(implicit read:DBObject=>_Value): List[_Value] ={
    this.collection.
      find(mongoDBObject).
      skip(findParameter.page).limit(findParameter.size).toArray.map(read).toList
  }

  /**
   * 通过Id从数据库中获取对象
   * @param id 查询Id
   * @param read
   * @return
   */
  def getById(id:String)(implicit read:DBObject=>_Value): Option[_Value] =
    this.find(createId(id)).headOption
  /**
   * find 辅助函数
   * @param read
   * @return
   */
  def list(findParameter: FindParameter=FindParameter.default
            )(implicit read:DBObject=>_Value): List[_Value] =
    this.find(findParameter=findParameter)(read)

  /**
   * 保存对象到数据库
   * @param value
   * @param write
   * @return success or failed
   */
  def add(value: _Value)(implicit write:_Value=>DBObject): Try[_Value] ={
    Try{
      this.collection.insert(write(value))
      value
    }
  }

  /**
   *
   * @param id
   * @param read
   * @return
   */
  def remove(id:String)(implicit read:DBObject=>_Value): Try[Option[_Value]] ={
    Try{
      val value=this.find(createId(id)).headOption
      this.collection.remove(createId(id))
      value
    }
  }

  protected def createId(id:String)=MongoDBObject("_id"->new ObjectId(id))
}

MongoImplicitDBObject–

/**
 * 用于将entity 与 DBObject 互转的 工具类
 * @tparam _Value entity value type
 */
class MongoImplicitDBObject[_Value<:EntityId:ClassTag]{
  implicit def EntityToMongoDBObject(entity: _Value): DBObject ={
    if (entity.id isEmpty)
      entity.id=new ObjectId().toString
    val a: Map[String, Any] = entity.ObjToJson.JsonToMap
    val id=a.getOrElse("id","").asInstanceOf[String]
    DBObject(a.-("id").+("_id"->new ObjectId(id)).toList)
  }

  implicit def MongoDBObjectToEntity(dBObject: DBObject): _Value ={
    if (dBObject==null)
      null.asInstanceOf[_Value]
    else{
      val id = dBObject._id.getOrElse("").toString
      dBObject.removeField("_id")
      val a: _Value =dBObject.toString.JsonToObj[_Value]
      a.id=id
      a
    }

  }
  implicit def MongoDBObjectToEntityOpt(dBObject: DBObject): Option[_Value]=
    if (dBObject==null)
      None
    else
      Some(MongoDBObjectToEntity(dBObject))


  def write(entity: _Value): DBObject =EntityToMongoDBObject(entity)
  def read(dBObject: DBObject): _Value =MongoDBObjectToEntity(dBObject)
}

EntityTest

case class EntityTest(
                       @BeanProperty var name:String=""
                       ) extends EntityId
object EntityTest extends MongoImplicitDBObject[EntityTest]

使用Scala操作Mongodb

介绍 Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件必不可少的...
  • yaoyasong
  • yaoyasong
  • 2014年09月30日 17:35
  • 9764

mongodb distinct

{ "_id" : ObjectId("532be543edb9e06960e550b3"), "name" : "tom", "salary" : 98 } { "_id" : ObjectId("...
  • neutrojan
  • neutrojan
  • 2014年03月24日 11:53
  • 3148

Scala连接mongodb数据库

mongodb是一种面向文档的数据库,Scala是一种函数式编程语言,由于项目的关系,需要使用Scala连接mongodb数据库。下面介绍具体的方法。 就像Java连接MySQL数据库需要JDBC一...
  • u012877472
  • u012877472
  • 2016年04月01日 20:43
  • 2986

spark+mongo Scala开发环境搭建

Scala开发mongo-spark应用,环境搭建。
  • chenguohong88
  • chenguohong88
  • 2017年09月20日 18:56
  • 404

Scala对MongoDB的增删改查操作

===========================================     原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! ==========...
  • yisun123456
  • yisun123456
  • 2017年09月29日 14:48
  • 167

【转】MongoDB的java版本驱动

转自:爱程序网站MongoDB的java版本
  • xiaoyw
  • xiaoyw
  • 2015年11月04日 10:04
  • 3075

mongoDB驱动连接mongoDB数据库详解

转载:查看原文 了解MongoDB 的 Replica Set的童鞋都知道它有failover故障智能转移的特性,那么当在编程语言(C/PHP/Python/Java等)中如何实现这一特性,...
  • azhao_dn
  • azhao_dn
  • 2012年02月20日 16:09
  • 2145

用C#操作Mongodb(c#mongodb驱动)

MongoDB的C#驱动基于.Net 3.5的 必要用.net 3.5以上的框架 1.对数据库的操作主要还是增删改查  2.了解c#操作mapreduce的语法 我们先布置驱动环境,再通过实例来...
  • q383965374
  • q383965374
  • 2013年02月26日 13:53
  • 7151

MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门

【引言】         毕竟现在MongoDB还是出于成长阶段,所以现在网上相关的资料很少,而且大部分还都是针对于MongoDB的老版本的。再加上MongoDB的频繁升级、重大更新等等,导致菜鸟学习...
  • qq_16313365
  • qq_16313365
  • 2016年08月28日 14:31
  • 4034

MongoDb Samus 驱动的改进

一直使用 MongoDb 的 Samus C#驱动。 其有一个缺陷,就是无法支持struct的读写。 但是一般数据都用Class包装,所以也没有太在意。 随着这些天尝试写入 KLineData 时,遇...
  • norsd
  • norsd
  • 2014年04月18日 17:53
  • 2309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb 的 scala 驱动 -> casbah
举报原因:
原因补充:

(最多只允许输入30个字)