Scala对MongoDB的增删改查操作

===========================================

    原文链接: Scala对MongoDB的增删改查操作 转载请注明出处!

===========================================

依赖环境:jdk1.8、Scala 2.12、idea

    mongodb Driver:3.1.1。注意,mongo for scala的驱动涉及多个jar(如下图),依赖于mongo-java-driver.jar

    这里使用的sbt管理依赖,直接在build.sbt中添加依赖:libraryDependencies += "org.mongodb" %% "casbah" % "3.1.1"(强烈建议使用该方法添加依赖)

一、创建数据库连接

A:不需要用户名和密码直接获取MongoDB。

  //  无权限验证连接
  def createDatabase(url: String, port: Int, dbName: String): MongoDB = {
    MongoClient(url, port).getDB(dbName)
  }

  这里需要注意一下,在导入的jar包存在两个MongoClient类,一个来自于mongo-java-driver.jar的com.mongodb.MongoClient,另一个来自于casbah-core_2.12:3.1.1.jar的com.mongodb.casbah.MongoClient.前者是用于java调用,Scala使用后者!!!

因此导入包的时候要注意为:import com.mongodb.casbah.MongoClient

B:通过权限验证进行连接

 //验证连接权限
  def createDatabase(url: String, port: Int, dbName: String, loginName: String, password: String): MongoDB = {
    var server = new ServerAddress(url, port)
    //注意:MongoCredential中有6种创建连接方式,这里使用MONGODB_CR机制进行连接。如果选择错误则会发生权限验证失败
    var credentials = MongoCredential.createCredential(loginName, dbName, password.toCharArray)
    var mongoClient = MongoClient(server, List(credentials))
    mongoClient.getDB(dbName)
  }

这里需要注意的是MongoCredential.createCredential(),在MongoCredential中存在着六种认证机制,这里使用createCredential()进行创建,使用错误则将会验证失败

com.mongodb.MongoSecurityException: Exception authenticating

Caused by: com.mongodb.MongoCommandException: Command failed with error 18: ‘auth failed‘ on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "auth failed", "code" : 18, "codeName" : "AuthenticationFailed" }

该方法注释如下:

/** * Creates a MongoCredential instance with an unspecified mechanism.  The client will negotiate the best mechanism * based on the version of the server that the client is authenticating to.  If the server version is 2.8 or higher, * the driver will authenticate using the SCRAM-SHA-1 mechanism.  Otherwise, the driver will authenticate using the * MONGODB_CR mechanism. * * @param userName the user name * @param database the database where the user is defined * @param password the user‘s password */

二、数据添加

  def testInsert(): Unit = {
    for (i <- 1 to 100)
      collection.insert(MongoDBObject("name" -> "Jack%d".format(i), "email" -> "jack%[email protected]".format(i), "age" -> i % 25, "birthDay" -> new SimpleDateFormat("yyyy-MM-dd").parse("2016-03-25")))
  }

这里的collection是在下面创建的:

 var collection= createDatabase("localhost", 27017, "mytest", "user", "123456").getCollection("user")

在进行数据插入的时候,如果不存在该collection则会自动创建(这里是user),如果document中不包含“_id”字段则会自动添加该字段。

DBCollection中存在一个save方法,该save方法区别于insert的地方在于当“_id”存在于集合中,save将会进行更新数据,而insert不会进行任何操作

根据需要选择适合的数据插入函数

存储之后数据如下:

{ "_id" : { "$oid" : "592ad4be45aefd09f4867f1e"} , "name" : "Jack86" , "email" : "[email protected]" , "age" : 11 , "birthDay" : { "$date" : "2016-03-24T16:00:00.000Z"}}
 { "_id" : { "$oid" : "592ad4be45aefd09f4867f1f"} , "name" : "Jack87" , "email" : "[email protected]" , "age" : 12 , "birthDay" : { "$date" : "2016-03-24T16:00:00.000Z"}}
{ "_id" : { "$oid" : "592ad4be45aefd09f4867f20"} , "name" : "Jack88" , "email" : "[email protected]" , "age" : 13 , "birthDay" : { "$date" : "2016-03-24T16:00:00.000Z"}}
{ "_id" : { "$oid" : "592ad4be45aefd09f4867f21"} , "name" : "Jack89" , "email" : "[email protected]" , "age" : 14 , "birthDay" : { "$date" : "2016-03-24T16:00:00.000Z"}}

三、数据更新修改

A:更新方式一

  def testUpdate(): Unit = {
    var query = MongoDBObject("name" -> "user1", "email" -> "[email protected]")
    var value = MongoDBObject("name" -> "user1", "email" -> "[email protected]")
    println("=========更新之前============")
    var query02 = MongoDBObject("name" -> "user1")
    collection.find(query02).forEach(x => println(x))
//    query:根据此条件进行查询  value:把查询出来结果集的第一条数据设置为value
    collection.update(query,value)
    println("=========更新之后============")
    collection.find(query02).forEach(x => println(x))
  }

运行结果如下:(注意这里只更新了一条记录,并不是把所有符合结果的数据都进行更新)

B:更新方式二

  def testUpdate02(): Unit = {
    var query = MongoDBObject("name" -> "user1", "email" -> "[email protected]")
    var value = new BasicDBObject("$set", new BasicDBObject("email", "[email protected]"))
    //     var value = MongoDBObject("$set",MongoDBObject("name" -> "user1", "email" -> "[email protected]"))
    println("=========更新之前============")
    var query02 = MongoDBObject("name" -> "user1")
    collection.find(query02).forEach(x => println(x))
    collection.update(query, value,true, true)
    println("=========更新之后============")
    collection.find(query02).forEach(x => println(x))
  }

注意该方法:collection.update(query, value,true, true)。

    第三个参数:when true, inserts a document if no document matches the update query criteria

    第四个参数:when true, updates all documents in the collection that match the update query criteria, otherwise only updates one【当该值为true时,则更新所有的结果集数据,不过前提是value必须使用“$XXX”模式进行定义】。源码如下:

四、数据查询(建议看下这篇文章:MongoDB学习笔记(查询)

  def testSelect(): Unit ={
    println("=========查询所有数据===================")
    collection.find().forEach(x => println(x))
    println("=========查询name = “user1”  同时email=“[email protected]”===================")
    collection.find(MongoDBObject("name" -> "user1", "email" -> "[email protected]")).limit(3).forEach(x => println(x))
    //    注意此处不能使用put添加其他查询条件,因为put返回的是HashMap,此处应该使用append进行添加查询条件
    //  var query = new BasicDBObject("name",new BasicDBObject("$in",("user145","user155"))).put("qty",new BasicDBObject("$in",(25.0,105.0)))  该方法错误
    //    查询条件为: (name in ("user145","user155")) && (qty in (25.0,105.0))
    println("=========查询 (name in (\"user145\",\"user155\")) && (qty in (25.0,105.0))===================")
    var query = new BasicDBObject("name", new BasicDBObject("$in", ("user145", "user155"))).append("qty", new BasicDBObject("$in", (25.0, 105.0)))
    collection.find(query).forEach(x => println(x))
    println("=========查询 start >= 10 && end<= 80 的数据===================")
    var query02 = new BasicDBObject("start", new BasicDBObject("$gte", 10)).append("end", new BasicDBObject("$lte", 80))
    collection.find(query02).forEach(x => println(x))
  }

查询结果如下:

五、数据删除

数据删除主要是构建一个查询条件,把符合该条件的所有数据都进行删除

  def testDelete(): Unit ={
    var query = MongoDBObject("name" -> "user1", "email" -> "[email protected]")
    println("=========删除之前============")
    collection.find(query).forEach(x => println(x))
    //该参数只是一个查询条件,符合该条件的所有集合都将被删除。重点在于如何构建query
    collection.remove(query)
    println("=========删除之前============")
    collection.find(query).forEach(x => println(x))
  }

执行结果如下:

=========删除之前============

{ "_id" : { "$oid" : "592a0c8345aefd1d404c3ed9"} , "name" : "user1" , "email" : "[email protected]"}
{ "_id" : { "$oid" : "592a0c8345aefd1d404c3eda"} , "name" : "user1" , "email" : "[email protected]"}
{ "_id" : { "$oid" : "592a0c9845aefd0dfc2a1e21"} , "name" : "user1" , "email" : "[email protected]"}
{ "_id" : { "$oid" : "592a0c9845aefd0dfc2a1e23"} , "name" : "user1" , "email" : "[email protected]"}
{ "_id" : { "$oid" : "592a740f434a43d3b1529d0e"} , "name" : "user1" , "email" : "[email protected]"}
=========删除之后============

remove方法有如下四种,根据具体情况选取合适的方法:

--end

时间: 2024-10-26 11:57:42

Scala对MongoDB的增删改查操作的相关文章

MongoDB之增删改查(一)

本文主要介绍MongoDB数据库增删改查操作. 增 mongoDB和其他关系型数据库一样,通过insert来增加数据到集合中去. db.collectionName.insert(内容) 显示数据库中所有集合: show collections 删 MongoDB中通过remove来删除集合中符合一定条件的文档. remove接受一个参数,作为寻找要删除文档的条件: 当然了,也可以直接删除一整个集合,通过drop方法: db.person.drop() 删除集合然后重建索引比删除集合中所有的文档

C# 对MongoDB 进行增删改查的简单操作

C# 对MongoDB 进行增删改查的简单操作 下面演示下C#操作MongoDB驱动的简单的增删改查代码 运用到的MongoDB支持的C#驱动,当前版本为1.6.0 下载地址:https://github.com/mongodb/mongo-csharp-driver/downloads 1,连接数据库 /// <summary> /// 数据库连接 /// </summary> private const string conn = "mongodb://127.0.0

使用MyEclipse对MongoDB数据库 进行增删改查操作

前面写了一篇MongoDB的下载与安装,接下来此篇写的是MongoDB数据库在JAVA程序中的基本功能: 使用MyEclipse对MongoDB数据库进行增删改查操作 1.导入JAR包 使用了Spring3.0:此类包,可以上网查询"MongoDB相关JAR包" 2.创建一个Person实体类 源代码如下: public class Person(){ //属性 Private String id; //id Private String name; //name Private in

MongoDB(三)——增删改查

MongoDB作为非关系型数据库,还是传统数据库的增删改查有很大的区别的,这里只是将知识点进行了一下提纲挈领,实际用的时候,我们百度一下详细用法即可.先看大的几个方面: 一,对于里边的插入和删除不再过多赘述,相对来说知识点比较少.先来看一下更新,常用操作还是非常有用的,需要我们根据实际情况灵活运用,这里只是提出了知识点,需要百度出例子来学习使用: 2,查询也是一样,看一下知识点的汇总,其实用几个,还是有规律的,比较容易记录的: 3,看一下固定集合Capped Collection:顾名思义是有着

Java连接MongoDB进行增删改查

1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean; import java.io.Serializable; import java.util.Date; /** * @since 对应于mongodb中的数据库test中的表com * @author think * */ public class Company implements Seri

MongoDB的增删改查 转

MongoDB的增删改查 (黎明你好原创作品,转载请注明) MongoDB中数据的基本单元叫做文档,采用json的键-值的方式.多个键及其关联的值有序的存放在一起变是文档.类似于编程语言中的键值关系.MongoDB文档都是BSON文档,他是一个JSON的二进制形式. MongoDB的文档 MongoDB中文档被存储在集合中.集合是一组有关系索引的文档.集合类似于关系数据库中的表. MongoDB的集合 2.1 方法参考 查询游标方法 名称 说明 cursor.count() 返回游标中的文档的数

mongoVUE的增删改查操作使用说明;一、查询;1、精确查询;1)右键点击集合名,再左键点击Find;或者直接点击工具栏上的Find;2)查询界面,包括四个区域;{Find}区,查询条件格式{&quot;se

mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{"sendId":"000101"}表示查询sendId=000101的记录, (注:mongodb区分大小写,写成{"sendid":"000101"}会查询不到) 查询条件包含and时,格式为:{"sendId&quo

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面进行描述.参考前文: Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中 Java+MyE