MongoDB的Java驱动使用整理 (转)

MongoDB Java Driver 简单操作
 
一、Java驱动一致性

 

 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个)。
 
 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,我们可以用以下方式保证一致性:
 
 DB mdb = mongo.getDB('dbname');
 
 mdb.requestStart();
 //
 // 业务代码
 //
 mdb.requestDone();

 

 DB和DBCollection是绝对线程安全的,它们被缓存起来了,所以在应用中取到的可能是同一个对象。

 

二、保存/查找对象(DBObject)

 

 Java驱动提供了DBObject接口,方便我们保存对象到数据库中。
 
 定义需要保存的对象:
 
 public class Tweet implements DBObject {
  /** ...... */
 }
 
 然后我们可以使用该对象:
 
 Tweet tweet = new Tweet();
 tweet.put("user", userId);
 tweet.put("message", message);
 tweet.put("date", new Date());
 
 collection.insert(tweet);
 
 当从数据库中查询时,结果会自动的转换成DBObject对象,我们可以转换成我们自己的类型:
 
 collection.setObjectClass(Tweet);
 
 Tweet myTweet = (Tweet)collection.findOne();

 

三、创建连接

 

 Mongo m = new Mongo();
 Mongo m = new Mongo("localhost");
 Mongo m = new Mongo("localhost", 27017);
 
 DB db = m.getDB("mydb);
 
 注意:事实上,Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了。
 
四、认证(可选的)

 

 boolean auth = db.authenticate("myUserName", "myPasswd");
 
五、取得Collection列表

 

 Set<String> colls = db.getCollectionNames();
 
 for(String s : colls) {
  System.out.prinln(s);
 }

 

六、获取一个Collection

 

 DBCollection coll = db.getCollection("testCollection");
 
 使用DBCollection,我们可以进行插入、查询数据等数据操作。

 

七、插入文档

 

 假设有个JSON文档如下所示:
 
 {
  "name": "MongoDB",
  "type": "database",
  "count": 1,
  "info": {
     x: 203,
     y: 102
    }
 }
 
 注意:上面的JSON文档有个内嵌文档"info"。
 
 我们完全可以利用BasicDBObject来创建一个和上面的JSON一样的文档,并且把它保存在MongoDB中。
 
 DBObject doc = new BasicDBObject();
 
 doc.put("name", "MongoDB");
 doc.put("type", "database");
 doc.put("count", 1);
 
 DBObject info = new BasicDBObject();
 info.put("x", 203);
 info.put("y", 102);
 
 doc.put("info", info);
 
 coll.insert(doc);
 
八、查询第一个文档(findOne())

 

 为了验证在上面我们保存的类似JSON的数据,我们可以用findOne()方法取得数据。
 
 findOne(): 返回一个文档;
 find(): 返回一个游标(DBCursor),其中包含一组对象DBObject;
 
 DBObject doc = coll.findOne();
 System.out.println(doc);
 
 我们将会看到控制台输出:
 { "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102} , "_ns" : "testCollection"}
 
九、插入多个文档

 

 为了在后来展示更多的查询方法,我们先插入几个文档,它们的JSON像这样:
 {
  "i": value
 }
 
 使用一个循环插入数据:
 
 for(int i = 0; i < 100; i++) {
  coll.insert(new BasicDBObject().append("i", i));
 }
 
 我们注意到,同一个coll,我们完全可以插入不同风格的数据,这就是MongoDB的重要特性“模式自由”。
 
十、统计文档数

 

 现在我们已经有101份文档在数据库中了,现在统计一下看是否正确。
 
 long count = coll.getCount();
 System.out.println(count);
 
 控制台将会输出:101
 
十一、使用游标取得所有的文档

 

 DBCursor cursor = coll.find();
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
十二、查询单个文档

 

 DBObject query = new BasicDBObject();
 
 query.put("i", 71);
 
 cursor = coll.find(query);
 
 while(cur.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
 控制台的输出类似如下:
 
 { "_id" : "49903677516250c1008d624e" , "i" : 71 , "_ns" : "testCollection"}
 
十三、查询文档集合

 

 根据查询条件,我们可以通过DBCollection从数据库中取出多个对象,比如查询i>50的文档集合:
 
 query = new BasicDBObject();
 
 query.put("i", new BasicDBObject("$gt", 50)); // i>50
 
 cursor = coll.find(query);
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
 比如查询条件为 20<i<=30:
 
 query = new BasicDBObject();
 
 // 20<i<=30
 query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
 
 cursor = coll.find(query);
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }

 

十四、创建索引

 

 MongoDB支持索引,并且给一个DBCollection添加索引非常简单,你只要指明需要创建索引的字段,然后指明其是升序(1)还是降序(-1)即可,比如在"i"上创建升序索引。
 
 coll.createIndex(new BasicDBObject("i", 1)); // 1代表升序
 
十五、查询索引

 

 我们可以查询到所有的索引:
 
 List<DBObject> list = coll.getIndexInfo();
 
 for(DBObject index : list){
  System.out.println(index);
 }
 
 控制台的输出类似如下所示:
 
 { "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} , "_ns" : "system.indexes"}

 


   MongoDB的管理功能
   
一、获取所有的数据库

 

 Mongo m = new Mongo();
 
 for(String s : m.getDatabaseNames()) {
  System.out.println(s);
 }

 

二、删除数据库

 

 m.dropDatabase("my_new_db");
 
 
   MongoDB的Java类型

 

一、对象ID

 

 ObjectId被用作自动生成的唯一ID.
 
 ObjectId id = new ObjectId();
 ObjectId copy = new ObjectId(id);
 
二、正则表达式

 

 Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
 DBObject query = new BasicDBObject("name", john);
 
 // 查询所有 "name" 匹配 /joh?n/i 的文档
 DBCursor cursor = collection.find(query);

 

三、日期和时间

 

 Date now = new Date();
 DBObject time = new BasicDBObject("ts", now);
 
 collection.save(time);
 
四、数据库引用

 

 DBRef可以用来保存数据库引用。
 
 DBRef addressRef = new DBRef(db, "foo.bar", address_id);
 DBObject address = addressRef.fetch();
 
 DBObject person = BasicDBObjectBuilder.start()
  .add("name", "Fred")
  .add("address", addressRef)
  .get();
 collection.save(person);
 
 DBObject fred = collection.findOne();
 DBRef addressObj = (DBRef)fred.get("address");
 addressObj.fetch();
 
五、二进制数据

 

 字节数组(byte[])被当作二进制数据。
 
六、内嵌文档

 

 JSON样式的数据如下:
 {
  "x": {
   "y": 3
  }
 }
 
 则在MongoDB中,Java表示为:
 
 DBObject y = new BasicDBObject("y", 3);
 DBObject x = new BasicDBObject("x", y);
 
七、数组

 

 任何继承自List的对象,在MongoDB中,都被当成是数组。
 
 如果想表示如下JSON数据:
 
 {
  "x": [
   1,
   2,
   {"foo": "bar"},
   4
  ]
 }
 
 则在Java中,应该为:
 
 List<Object> x = new ArrayList<Object>();
 x.add(1);
 x.add(2);
 x.add(new BasicDBObject("foo", "bar"));
 x.add(4);
 
 DBObject doc = new BasicDBObject("x", x);
 System.out.println(doc);

转载于:https://www.cnblogs.com/qq78292959/p/4089311.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 变量、数据类型

文章目录1. 变量、常量2. 数据类型1. 变量、常量 final 修饰常量 public class Variable {static final int YEAR 365;// 常量使用 final 修饰, 不可修改&#xff0c;类似C的 conststatic int day 0;// 成员变量public static void main(String[] args){System.out.println…

html背景图不显示_批量显示多张有序排列的图标,使用精灵图CSS Sprites这种办法...

让你显示一个天气图标你会怎么显示呢&#xff1f;让你做一个简单的动图你会怎么采用什么方式呢&#xff1f;让你输出一个长期固定的图标列表你会怎么编写代码呢&#xff1f;如果不管性能&#xff0c;不用css&#xff0c;不用js&#xff0c;可能你会这么写html&#xff1a;<类…

mysql堵塞等级_MySQL 事务隔离级别

前言简单来说&#xff0c;数据库事务就是保证一组数据操作要么全部成功&#xff0c;要么全部失败。在 MySQL 中&#xff0c;事务是在引擎层实现的。原生的 MyISAM 引擎不支持事务&#xff0c;也是为什么 InnoDB 会取代它的重要原因之一。隔离性与隔离级别当数据库上有多个事务同…

水晶报表取消输入密码最后测试结果

哈哈&#xff0c;找了很多资料终于解决了。 //添加引用 using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类 using CrystalDecisions.CrystalReports .Engine ;//负责解释ReportDocument类private void Page_Load(object sender, System.EventArgs e) //然后在水晶报表…

Java 运算符、表达式、语句

文章目录1. 运算符2. 表达式3. 语句1. 运算符 赋值运算 , -, *, /, % 算术运算 , -, !, ~ 一元运算 关系运算 >, <, >, <, , ! 返回布尔 递增&#xff0c;递减--&#xff0c;支持&#xff08;float&#xff0c;double&#xff09;1, -1 逻辑运算 &&…

安装mysql没有提示设置密码_18.04安装mysql没有提示输入密码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼MySQL 5.7不再弹出root密码设置sudo vi /etc/mysql/debian.cnf显示&#xff1a;# Automatically generated for Debian scripts. DO NOT TOUCH![client]host localhostuser debian-sys-maintpassword fPw**********22socket /v…

arrays中copyof复制两个数组_Java的数组初识和拷贝用法

方法重载&#xff1a;方法名称相同&#xff0c;参数列表不同。不能有两个名字相同、参数类型相同&#xff0c;返回值不同的方法。在进行方法重载时&#xff0c;方法的返回值一定相同&#xff01;&#xff01;&#xff01;方法递归特点&#xff1a;1.必须有结束条件2.每次递归处…

你不知道的 字符集和编码(编码字符集与字符集编码)

我的上篇文章&#xff0c;有朋友提出字符集和编码的区别&#xff0c;我在此立文和大家讨论下 常说的字符集和编码区别&#xff0c;其实就是编码字符集和字符集编码的区别&#xff0c;其实&#xff0c;单单如果只是说字符集&#xff0c;没有任何编码的概念的话&#xff0c;那么字…

Java 数组及多维数组

注意一点&#xff0c;数组每行可以不等长可以两种写法&#xff0c;直接枚举初始化&#xff0c;或者new type [len1][len2]... import java.util.Arrays;public class Myarray {public static void main(String[] args){// 一维数组声明int arr1 [] new int[3];int [] arr2 {…

迷宫搜索问题最短路_【算法常用模板】总结(更新中)

搜索类图类排序类并查集数学类位运算Part1 搜索类bfs 求迷宫问题最短路径(未验证)#include#includeusing namespace std;//用于遍历的结构 (可以添加题目所要求的信息)typedef struct Node{int x,y;int step;}NODE;const int NUM 100; //地图最大范围&#xff0c;根据要求具体…

hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控

作者简介&#xff1a;张博&#xff0c;网易高级信息安全工程师。0x00 简介在入侵检测的过程中&#xff0c;进程创建监控是必不可少的一点&#xff0c;因为攻击者的绝大多数攻击行为都是以进程的方式呈现&#xff0c;所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为…

caffe模型文件解析_Caffe ImageData神经网络基本示例无法解析模型文件

我正在尝试使用我使用caffe库从CSV文件准备的 **_图像数据_** 构建神经网络的最小示例。I am trying to build a minimal example of a neural network with **_IMAGE DATA_** that I have prepared from a CSV file using the caffe libraries.我的原始文本如下&#xff1a;\[…

付忠庆的练习小笔记-Codeforces #277 Div2 C

原题链接 http://codeforces.com/contest/486/problem/C 这个C题显然更水一些 步数可以分为两种 上下一种 左右一种 总步数最小 上下最小左右最小 先讨论上下最小 就是从两个方向去由字母1到字母2 min(dis(A,B),26-dis(A,B)); 然后讨论左右最小 pos是起始指针的位置 1-统一在…

Java 类的封装、继承、多态

// 封装、继承、多态 class Person1{String name;int age;private int height;// 私有 封装public Person1(String name, int age){this.name name;this.age age;}public void talk(){System.out.println("This is father class talk() !");}public void setHeight…

hive 创建表_2min快速了解,Hive内部表和外部表

在了解内部表和外部表区别前&#xff0c;我们需要先了解一下Hive架构 &#xff1a;大家可以简单看一下这个架构图&#xff0c;我介绍其中要点&#xff1a;Hive的数据分为两种&#xff0c;一种为普通数据&#xff0c;一种为元数据。元数据存储着表的基本信息&#xff0c;增删改查…

C#微信公众号开发系列教程二(新手接入指南)

此系列前面已经更新了两篇博文了&#xff0c;都是微信开发的前期准备工作&#xff0c;现在切入正题&#xff0c;本篇讲解新手接入的步骤与方法&#xff0c;大神可直接跳过&#xff0c;也欢迎大神吐槽。 微信公众号开发系列教程一&#xff08;调试环境部署&#xff09; 微信公众…

oracle增加字段为主键自增_在 Oracle 中设置自增列

如果你经常使用 MySQL&#xff0c;你肯定对 AUTO_INCREMENT 非常熟悉&#xff0c;因为经常要用到它。一、什么是自增列 &#xff1f;自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段&#xff0c;这样每次增加一行时&#xff0c;不用指该字段的值&am…

Java 抽象类、接口

abstract class 抽象类定义规则如下: (1) 抽象类和抽象方法都必须用 abstract 关键字来修饰。 (2) 抽象类不能被直接实例化&#xff0c;也就是不能用new关键字去产生对象。 (3) 抽象方法只需声明&#xff0c;而不需实现。 (4) 含有抽象方法的类必须被声明为抽象类&#xff0c…

fastdfs windows部署_Go在windows下编译Linux可执行文件

欢迎关注我的头条号&#xff1a;Wooola&#xff0c;专注于Java、Golang、微服务架构&#xff0c;致力于每天分享原创文章、快乐编码和开源技术。前言最近楼主做了一个滑块验证码登录功能&#xff0c;但有个问题&#xff0c;悲观估计一天大约会产生两百多G临时图片放在fastdfs文…

python按索引删除字符串,基于特定的索引字符串值选择记录,然后通过python删除后续字段...

I have a .csv file named file01.csv that contains many records. Some records are required and some are not. I find that the required records has a string variable “Mi”, but it is not exist into the unnecessary records. So, I want to select the required r…