`
worldly
  • 浏览: 43715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MongoDb的接口使用(Java版本)

阅读更多

本文将介绍MongoDB的使用,主要有:

  • MongoDB的简介以及导入样例数据;
  • Java Driver的概览;
  • 基本的CRUD操作和数据聚合( Aggregation);
  • 创建索引以提高查询性能。

1.MongoDB的简介以及导入样例数据

MongoDB是一个提供高性能的文档数据库(document database),它通过消除对对象关系模型(ORM)的刚性需求从而促进开发。

Documents:document是指MongoDB中的记录,由field和value对组成。MongoDB中的document与JSON对象相类似。fields对应的values可以包含其他的document,数组document数组。

Collections:在MongoDB中,document是存储在Collections(集合)中的,Collections类似于关系型数据库中的table,但又不是table,因为Collection并不需要它的document拥有同样的模式(schema),如下表示一个restaurants collection:

{
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

2.导入样例数据

a)准备一份数据并命名为primer-dataset.json,如附件所示。

b)将数据导入collection

在命令行或者shell终端,使用mongoimport将准备好的document插入test数据库中的restaurant collection中。

cd /Users/young/Desktop/MongoDB
mongoimport --db test --collection restaurants --drop --file primer-dataset.json

如果test中已经存在restaurant collection,该操作将首先会drop掉restaurant collection。

mongoimport 默认连接上一个运行在本地的默认端口为27017的mongod实例。如果需要将数据导入其他的MongoDB,需要使用--host 和 --port 指出主机名和端口号。

3.Java Driver的概览

MongoDB的Java Driver是官方支持的。

a)下载MongoDB的Java驱动和BSON库文件。

http://mongodb.github.io/mongo-java-driver/?_ga=1.254442379.2073848550.1463710724

b)连接到MongoDB

使用com.mongodb.MongoClient类可以连接到运行的mongod实例。可以使用 com.mongodb.client.MongoDatabase接口访问一个指定的MongoDB数据库。

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");

 4.调用Java驱动实现CRUD功能

 a)插入数据

你可以使用insertOne方法将一个document插入到MongoDB的指定的collection中,如果这个collection不存在,MongoDB将会自动创建该collection并执行操作。

import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.text.DateFormat;
import java.text.ParseException;
public void insertDocument(MongoDatabase db, String collection, Document document) throws ParseException {
		// DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",
		// Locale.ENGLISH);
		db.getCollection(collection).insertOne(document);
	}

 这段代码将document插入db.collection中,定义document,可以使用 org.bson.Document :

 

new Document("address",
                new Document()
                        .append("street", "2 Avenue")
                        .append("zipcode", "10075")
                        .append("building", "1480")
                        .append("coord", asList(-73.9557413, 40.7720266)))
                .append("borough", "Manhattan")
                .append("cuisine", "Italian")
                .append("grades", asList(
                        new Document()
                                .append("date", format.parse("2014-10-01T00:00:00Z"))
                                .append("grade", "A")
                                .append("score", 11),
                        new Document()
                                .append("date", format.parse("2014-01-16T00:00:00Z"))
                                .append("grade", "B")
                                .append("score", 17)))
                .append("name", "Vella")
                .append("restaurant_id", "41704620")
 执行插入操作不返回任何结果。如果传递给insertOne的document不包含_id  field,Java驱动将会自动增加该field并使用该_id对应的值生成对象id(ObjectId)。插入多个document可以使用 insertMany方法。

 

b)检索数据

你可以使用find方法发布一个查询从MongoDB中检索数据。在MongoDB中,所有的所有的查询是在一个单独的collection中。查询操作可以返回指定collection中所有的document或者匹配 org.bson.Document定义的过滤标准的document。

 

public FindIterable<Document> FindCollection(MongoDatabase db, String collection, Document document) {
		FindIterable<Document> iterator = null;
		if (null == document)
			iterator = db.getCollection(collection).find();
		else
			iterator = db.getCollection(collection).find(document);
		return iterator;
	}

 

find方法返回一个生成document的 FindIterable的迭代器对象。

 

 FindIterable<Document> iterator=mongoDBInstance.FindCollection(db,
		 collection, null);
		iterator.forEach(new Block<Document>(){
	
		 @Override
		 public void apply(final Document document) {
		 System.out.println(document);
		 }
		
		 });
 使用MongoDB的Java Driver,用如下的的方式相等:

 

 

new Document( <field>, <value> )

 

如果 <field>是嵌套的,使用点记法访问。Java Driver同事提供了com.mongodb.client.model.Filters描述查询条件,该类提供了很多静态方法方便地创建插叙判断,如eq方法:

 

eq(<field>, <value>)//等于
lt(<field>, <value>)//小于
gt(<field>, <value>)//大于
 查询没有嵌套层的Field:

 

 

FindIterable<Document> iterable = mongoDBInstance.getCollection("restaurants").find(
        new Document("borough", "Manhattan"));
 或者使用Filters:

 

 

FindIterable<Document> iterable = mongoDBInstance.getCollection("restaurants").find(
        eq("borough", "Manhattan"));
 查询一个嵌套的Field:

 

 

FindIterable<Document> iterable = mongoDBInstance.getCollection("restaurants").find(
        eq("address.zipcode", "10075"));
 查询一个数组中的Field:

 

 

FindIterable<Document> iterable=mongoDBInstance.getCollection("restaurants").find(eq("grades.grade", "B"));
 c)更新document

 

可以使用 updateOne 、 updateMany、replaceOne方法更新collection中的document,这些方法都接受如下三种参数:

  • filtes描述的document匹配规则
  • 指定修改部分的document
  • 其他可选的参数

需要注意的是_id这个Field是不可以被更新的。

1)更新顶级的Fields

如下代码更新了第一个name是Juni的document,用$set操作更新了cuisine为American (New),同时(append)用$currentDate操作更新了lastModified为当前时间。

 

mongoDBInstance.getCollection("restaurants").updateOne(new Document("name", "Juni"),
        new Document("$set", new Document("cuisine", "American (New)"))
            .append("$currentDate", new Document("lastModified", true)));
 2)更新嵌套的Field
如下更新了嵌套在address中的street这个Field:
mongoDBInstance.getCollection("restaurants").updateOne(new Document("restaurant_id", "41156888"),
        new Document("$set", new Document("address.street", "East 31st Street")));
 updateOne方法返回一个UpdateResult对象,这个对象包含了本次操作的一些信息。如UpdateResult.getModifiedCount()返回这次更新的document的数量。
3)同时更新多个document
更新多个document,使用updateMany方法。如下操作将更新address.zipcode等于10016,并且cuisine等于Other的所有document。
mongoDBInstance.getCollection("restaurants").updateMany(new Document("address.zipcode", "10016").append("cuisine", "Other"),
        new Document("$set", new Document("cuisine", "Category To Be Determined"))
                .append("$currentDate", new Document("lastModified", true)));
 updateMany方法返回一个UpdateResult对象,这个对象包含了本次操作的一些信息。如UpdateResult.getModifiedCount()返回这次更新的document的数量。
4)document的替换
替换整个文档(不包含_id),需要传递一个完整的新的document给 replaceOne的第二个参数。替换的document可以有与原document不一样的Field。前者可以省略掉_id因为它是不可以改变的。如果您的新document包含_id,必须确保其与原document具有相同的值。
mongoDBInstance.getCollection("restaurants").replaceOne(new Document("restaurant_id", "41704620"),
        new Document("address",
                new Document()
                        .append("street", "2 Avenue")
                        .append("zipcode", "10075")
                        .append("building", "1480")
                        .append("coord", asList(-73.9557413, 40.7720266)))
                .append("name", "Vella 2"));
 replaceOne操作也返回一个UpdateResult对象,这个对象包含了本次操作的一些信息。如UpdateResult.getModifiedCount()返回这次更新的document的数量。
d)删除数据
从collection中删除document可以使用deleteOne和deleteMany方法。方法中需要携带一个条件用以决定哪个document需要被删除。指定这样一个document的方法跟查询操作的一样。
mongoDBInstance.getCollection("restaurants").deleteMany(new Document("borough", "Manhattan"));
mongoDBInstance.getCollection("restaurants").deleteMany(new Document());
mongoDBInstance.getCollection("restaurants").drop();
 第一行代码将会删除restaurant中borough为Manhattan的所有document,第二行代码将会删除restaurant中的所有document,但是restaurant本身以及在其上建立的索引,均不会被删除,第三行代码将会达到这种效果。
在MongoDB中写是一个原子操作,这就意味着删除操作可以和其他写操作交替进行。
e)数据聚集
MongoDB可以执行聚集操作,如根据一个指定的key分组、评估总数以及给定组的数量。
根据Field分组以及评估数量
AggregateIterable<Document> iterable = mongoDBInstance.getCollection("restaurants").aggregate(asList(
        new Document("$match", new Document("borough", "Queens").append("cuisine", "Brazilian")),
        new Document("$group", new Document("_id", "$address.zipcode").append("count", new Document("$sum", 1)))));
 聚集操作是根据指定field的value进行。
f)索引
索引可以提高查询的效率。若没有索引,MongoDB的查询将会是在整个collection中进行一遍扫描,从而找出匹配查询条件的document。如果从在合适的索引,MongoDB可以使用索引限制检索document的数量。
在collection上创建索引使用 createIndex 方法。collection一旦创建,MongoDB将会自动在_id字段创建索引。
在field上或者fields上创建索引,需要用org.bson.Document指定需要创建索引的fields以及索引类型,并将它传给createIndex方法。
new Document(<field1>, <type1>).append(<field2>, <type2>) ...
 type为1:升序
type为-1:降序
1)在单个Field上创建索引
mongoDBInstance.getCollection("restaurants").createIndex(new Document("cuisine", 1));
 
2)创建混合索引
mongoDBInstance.getCollection("restaurants").createIndex(new Document("cuisine", 1).append("address.zipcode", -1));
 创建索引的操作没有返回结果。

 

 

 

分享到:
评论

相关推荐

    mongodb driver for java 源码

    以下是对MongoDB Java驱动2.5.3版本源码的一些关键知识点的详细解释: 1. **连接管理**: - `MongoClient`类是与MongoDB建立连接的主要入口点。它负责创建和管理`MongoServerAddress`对象,这些对象表示到MongoDB...

    mongodb_java_2.6_API

    本篇将深入探讨"mongodb_java_2.6_API",即MongoDB 2.6版本的Java驱动程序API,了解如何使用Java进行MongoDB的开发。 1. **MongoDB Java驱动程序概述** MongoDB的Java驱动程序是Java开发者与MongoDB服务器通信的...

    windows 64位mongodb安装包+java api文档

    这份文档将详细介绍MongoDB Java驱动的所有类、接口和方法,包括如何连接数据库、操作集合、处理查询结果、事务管理等。它是开发者编写Java代码与MongoDB交互的重要参考资料,通过查阅文档,你可以了解每个API的使用...

    mongodb-java-driver源码依赖库

    10. **`com.mongodb.async.*`**:对于异步编程,MongoDB Java Driver提供了异步版本的客户端和集合操作,以配合Java 8的 CompletableFuture 或其他异步库。 了解这些核心概念后,开发者可以更有效地使用MongoDB ...

    mongodb的java驱动3.2版本

    MongoDB的Java驱动3.2版本是连接Java应用程序与MongoDB数据库的重要组件,它提供了丰富的API,使得开发人员能够方便地执行CRUD(创建、读取、更新、删除)操作以及更复杂的数据库交互。MongoDB是一款流行的开源文档...

    MongoDB Driver -JAVA 2.5.3 API

    为了更好地理解和使用这个API,你可以查阅MongoDB Driver for Java 2.5.3的CHM文件,其中详细解释了每个类、接口和方法的功能和用法。这将帮助你编写出高效且健壮的MongoDB应用程序。在实际开发中,理解如何正确处理...

    Java连接mongoDB需要的jar包(3.9.1)

    2. `mongodb-driver-3.9.1.jar`: 这是MongoDB Java驱动的主要部分,提供了与MongoDB服务器通信所需的类和接口。它实现了连接管理、命令执行、查询和写入操作等功能。开发者可以使用这个库来创建MongoClient实例,...

    MongoDB入门教程 + 架构简析 + java使用MongoDB的简单程序

    在"Java使用MongoDB的简单程序"中,我们将学习如何使用Java驱动程序连接到MongoDB数据库。Java驱动程序提供了一套API,使得开发者可以轻松地进行数据操作。基本步骤包括:创建MongoClient实例以连接到MongoDB服务器...

    mongodb java Driver

    此外,`MongoDB Java驱动程序`的版本更新也会带来新的特性与改进,比如`mongo-2.5.3.jar`是较旧的一个版本,可能不包含最新的功能和性能提升。 为了更好地理解和使用MongoDB Java驱动程序,建议参考官方文档和社区...

    mongodb 3.4.2 java包

    MongoDB 3.4.2 是一个非常重要的版本,它为Java开发者提供了高效、可靠的数据库存储和查询功能。MongoDB是一个流行的开源、分布式文档数据库,它以JSON格式存储数据,支持丰富的查询语法,具备高性能、高可用性和可...

    mongoDB java driver api

    MongoDB是一个高性能、开源、无模式的文档型数据库,而Java驱动API则为Java开发者提供了一个直观且强大的接口来操作MongoDB。 首先,让我们了解一下MongoDB Java驱动API的基本结构和核心概念: 1. **MongoClient**...

    jdbc java mongodb mysql 相互同步

    本文将深入探讨如何使用Java的JDBC(Java Database Connectivity)接口与MongoDB、MySQL数据库进行数据交互,并实现相互之间的数据同步。 首先,我们需要理解JDBC,它是Java语言访问数据库的标准API,能够连接并...

    MongoDB-Java驱动API

    它实现了所有的MongoDB协议,并提供了一系列的类和接口,如MongoClient、MongoDatabase和MongoCollection等,供开发者使用。通过这些API,你可以执行增删查改(CRUD)操作,实现数据的存储和检索。 二、连接MongoDB...

    mongo-java-driver-3.4.3,java连接mongodb的jar包驱动包

    mongo-java-driver-3.4.3.jar 是 MongoDB 官方为 Java 开发者提供的 Java 驱动程序的一个特定版本(3.4.3)。这个 JAR 文件包含了与 MongoDB 数据库进行交互所需的类和接口,允许 Java 应用程序连接到 MongoDB 实例...

    mongodb_java_demo

    此外,你提到的CSDN博客链接提供了更详细的教程和示例代码,可以帮助你深入了解MongoDB Java驱动程序的使用。在那里,你可能会找到关于聚合操作、索引创建、事务处理等更高级主题的讨论。 总之,"mongodb_java_demo...

    mongodb的实现类及实现接口

    在Java中,我们可以使用MongoDB的Java驱动程序来实现对数据库的CRUD操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。这里我们关注的是如何通过接口和实现类来实现这些功能。 首先,`...

    Mongodb 2.2_java api

    MongoDB 2.2是MongoDB数据库的一个早期版本,它为开发者提供了丰富的功能,特别是对于Java应用程序来说。MongoDB是一个NoSQL数据库系统,以其高效、灵活的数据模型和强大的查询能力而受到广泛欢迎。在Java API方面,...

    mongodb的java驱动jar包3.7.0

    MongoDB的Java驱动是连接Java应用程序与MongoDB数据库的关键组件,3.7.0版本是这一驱动的一个稳定发行版。这个压缩包包含了三个核心的JAR文件,它们分别是`mongodb-driver-3.7.0.jar`、`mongodb-driver-core-3.7.0....

    mongodb在java中小试牛刀

    在Java中使用MongoDB,我们可以借助Spring Data MongoDB框架,它提供了一种简化的方式来操作MongoDB数据库。 首先,让我们了解Spring Data MongoDB的核心概念。Spring Data MongoDB为MongoDB提供了数据访问抽象层,...

Global site tag (gtag.js) - Google Analytics