`
mj4d
  • 浏览: 302929 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java操作mongodb(二)之修改、删除及其他

阅读更多

上文,主要整理了java操作mongodb的一些基本概念以及新增、查询等操作,本文对修改、删除等做一些总结

1、修改、删除

删除操作

//根据指定条件删除,与下面方法一致,调用默认WriteConcern.NORMAL:网络错误时抛出异常
collection.remove(new BasicDBObject("name", "robin"));
//根据指定条件删除,指定写入模式
collection.remove(new BasicDBObject("username", "robin"), WriteConcern.NORMAL);

更新提供了一个多态的方法供使用:

/**
*q         根据条件查询需要更新的记录
*o         更新集合
*upsert 如果没有记录q是否插入
*multi    是否更新多条
*/
public abstract WriteResult update( DBObject q , DBObject o , boolean upsert , boolean multi , WriteConcern concern, DBEncoder encoder );

 如:

//根据age=32更新,注意更新后该文档只有username=jack,同时多条只会更新一条,不存在不会插入
WriteResult cursor = collection.update(new BasicDBObject("age", 32), new BasicDBObject("username", "jack"));
//根据age来更新,会追加熟悉gengder=male
collection.update(new BasicDBObject("age", 33), new BasicDBObject("$set", new BasicDBObject("gender", "male")));

//根据username来更新,修改age如果没有追加,更新所有满足条件的文档
collection.update(new BasicDBObject("username", "jack"),
        new BasicDBObject("$set", new BasicDBObject("age", 32)), false, true);

//根据username更新,且age+10
collection.updateMulti(new BasicDBObject("username", "jack"), new BasicDBObject("$inc", new BasicDBObject(
        "age", 10)));

以上各个方法都返回WriteResult,需要返回更多信息可以通过WriteConcern来设置。同时还提供了其他接口来获取更新的数据(包括更新前或更新后的数据)

 /**
     * Finds the first document in the query and updates it.
     * @param query query to match
     * @param fields fields to be returned
     * @param sort sort to apply before picking first document
     * @param remove if true, document found will be removed
     * @param update update to apply
     * @param returnNew if true, the updated document is returned, otherwise the old document is returned (or it would be lost forever)
     * @param upsert do upsert (insert if document not present)
     * @return the document
     * @throws MongoException
     */
    public DBObject findAndModify(DBObject query, DBObject fields, DBObject sort, boolean remove, DBObject update, boolean returnNew, boolean upsert) 

 

 

2、数据库、索引

2.1数据库

mongodb中的数据库对应文档,在前面已经介绍可以通过

DB db = mongo.getDB("sample");

来实例一个数据库对象,如果当然Mongo实例没有该数据库会默认创建一个。此外还提供了一些方法操作数据库:

//获取当前mongo实例创建后所有数据库,可能包括在客户端创建而服务端不存在的数据库(数据库开始在客户端不存在)
public Collection<DB> getUsedDatabases();

//返回服务端所有数据库名字
public List<String> getDatabaseNames();

//删除指定数据库
public void dropDatabase(String dbName);

当然对于数据库,删除也可以通过DB对象方法:

//删除数据库
DB db = mongo.getDB("sample");
db.dropDatabase();
db.command(new BasicDBObject("dropDatabase", 1));

 

2.2索引

在mongo中,我们可以通过以下命令来建立索引:

//对username建立索引
db.smaple.ensureIndex({"username":1})
//对username建立正向索引,age简历反向索引
db.smaple.ensureIndex({"username":1, "age":-1})
//唯一索引
db.smaple.ensureIndex({"username":1},{"unique":true})
//消除重复索引
db.smaple.ensureIndex({"username":1},{"unique":true,"dropDups":true})

在java中也可以通过以下api来做同样的事情:

//创建索引
collection.createIndex(new BasicDBObject("username", 1));
//指定索引名称
collection.ensureIndex(new BasicDBObject("age", -1), "age_index");
//创建唯一索引:如果数据重复将会报错
//com.mongodb.MongoException$DuplicateKey: E11000 duplicate key error index: sample.user.$age_name_index  dup key
collection.ensureIndex(new BasicDBObject("age", -1).append("username", 1), "age_name_index", true);
//根据索引名称删除
collection.dropIndex("username_1");
//删除索引索引
collection.dropIndexes();

 

3、其他

1、索引与执行计划

现在表sample有10w数据内容如下:

{"username":"robin-i", "age":i,"info":{"title":"jee","salary":i}} 

根据条件查询

collection.find(new BasicDBObject("username", "robin-123")) 

这里通过对username建立索引来查看其执行计划:

//对username建立升序的索引
collection.ensureIndex(new BasicDBObject("username", 1), "username_index"); 
//通过DbCursor的explain()来查看执行计划
collection.find(new BasicDBObject("username", "robin-123")).explain()

下面是没有建索引和建立索引后两者的执行计划:

{ "cursor" : "BasicCursor" , "nscanned" : 100000 , "nscannedObjects" : 100000 , "n" : 1 , "millis" : 66 , "nYields" : 0 , "nChunkSkips" : 0 , "isMultiKey" : false , "indexOnly" : false , "indexBounds" : { } , "allPlans" : [ { "cursor" : "BasicCursor" , "indexBounds" : { }}] , "oldPlan" : { "cursor" : "BasicCursor" , "indexBounds" : { }}}
{ "cursor" : "BtreeCursor username_index" , "nscanned" : 1 , "nscannedObjects" : 1 , "n" : 1 , "millis" : 0 , "nYields" : 0 , "nChunkSkips" : 0 , "isMultiKey" : false , "indexOnly" : false , "indexBounds" : { "username" : [ [ "robin-123" , "robin-123"]]} , "allPlans" : [ { "cursor" : "BtreeCursor username_index" , "indexBounds" : { "username" : [ [ "robin-123" , "robin-123"]]}}]}

重点关注cursor、nscanned、n、millis等参数:

cursor: 这里出现的是”BasicCursor"和"BtreeCursor username_index"。就是说前者使用了表扫描,后者使用了索引
nscanned: 前者没有索引扫描了10w条数据,而后者仅扫描了1条,结果已很明显
n: 这里是1,也就是最终返回了1个文档。
millis: 执行查询花费的时间,这是我们很关注的因素,前者耗时66ms,而有索引的0ms

 

2、聚合

在mongodb官网有介绍具体用法http://www.mongodb.org/display/DOCS/Aggregation这里主要介绍java中对聚合的一些支持,包括count、sort、distinct、group等,对高级的mapreduce并不涉及

2.1、count

//会立即返回该文档的记录数
collection.count()
//返回匹配的数量
collection.count(DBObject query)

 

2.2、sort

sort是对结果集的操作,故DBCursor中

DBCursor cursor = collection.find().sort(new BasicDBObject("username", 1));

这个方法必须要在从DBCursor获取对象之前调用

 

2.3、distinct

对指定的字段去重复查询

{ "_id" : ObjectId("5098d9c782967d6792743d6c"), "name" : "Robin", "age" : 30 }
{ "_id" : ObjectId("5098d9c782967d6792743d6d"), "name" : "Lisa", "age" : 28 }
{ "_id" : ObjectId("5098d9c782967d6792743d6e"), "name" : "Amanda", "age" : 28 }
{ "_id" : ObjectId("5098d9c782967d6792743d6f"), "name" : "Ace", "age" : 27 }
{ "_id" : ObjectId("5098d9c782967d6792743d70"), "name" : "Joe", "age" : 30 }

 采用mongo的runCommand:

> db.runCommand({'distinct':'foo','key':'age'});
{
	"values" : [
		30,
		28,
		27
	],
	"stats" : {
		"n" : 5,
		"nscanned" : 5,
		"nscannedObjects" : 5,
		"timems" : 0,
		"cursor" : "BasicCursor"
	},
	"ok" : 1
}

 javaApi的支持:

List list = collection.distinct("age");
返回[30,28,27]
List list = collection.distinct("age", new BasicDBObject("name", "Robin"));
返回[30]

 

2.4、group

还是上面的数据,我们根据age来分组,将name用","分割

String reduce = "function(cur, pre){pre.name += cur.name+' '}";
GroupCommand command = new GroupCommand(collection, new BasicDBObject("age", true), null, new BasicDBObject("name", ""), reduce, null);
DBObject dbObject = collection.group(command);
{ "age" : 30.0 , "name" : "Robin Joe "} , { "age" : 28.0 , "name" : "Lisa Amanda "} , { "age" : 27.0 , "name" : "Ace "}

还有几个多态的API,根据参数不同调用,都会用到上面的GroupCommand,这里结束GroupCommand中的几个属性的意思:

    public GroupCommand(DBCollection inputCollection, DBObject keys, DBObject condition, DBObject initial, String reduce, String finalize) {
        this.input = inputCollection.getName();
        this.keys = keys;
        this.condition = condition;
        this.initial = initial;
        this.reduce = reduce;
        this.finalize = finalize;
    }
keys: 这个就是分组的key,这里是age。支持多个
initial: 初始化参数,这里指定name其值为“”,当然如果我们涉及求和我们可以指定该初始值为0
reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象
condition:指定过滤条件

 

2.3、命令

mongodb提供了许多命令对数据的管理或CURD操作。比如要查看数据库的状态,我们可以:

> db.runCommand({"dbStats":1})
{
	"db" : "sample",
	"collections" : 3,
	"objects" : 17,
	"avgObjSize" : 63.76470588235294,
	"dataSize" : 1084,
	"storageSize" : 11008,
	"numExtents" : 3,
	"indexes" : 1,
	"indexSize" : 8192,
	"fileSize" : 16777216,
	"ok" : 1
}

可以通过在启动参数后加上

--rest 

查看命令http://localhost:28017/_commands 或者更多的命令见http://docs.mongodb.org/manual/reference/command/

当然java驱动也提供了相应的接口:

CommandResult command = db.command("dbStats");
CommandResult res = command(new BasicDBObject("dropDatabase", 1));

另外还提供了一些列的方法可供使用,其实在javaApi中不难发现很多方法底层调用的这样的命令,如下面的删除索引的方法:

    public void dropIndexes( String name ){
        DBObject cmd = BasicDBObjectBuilder.start()
            .add( "deleteIndexes" , getName() )
            .add( "index" , name )
            .get();

        resetIndexCache();
        CommandResult res = _db.command( cmd );
        if (res.ok() || res.getErrorMessage().equals( "ns not found" ))
            return;
        res.throwOnError();
    }

这里罗列一些常见的命令,当然在javaApi中基本都有同名的方法:

//返回指定集合的统计信息
{"collStats" : collection}
//去从
{"distinct" : collection, "key" : key, "query" : query}
//删除集合数据
{"drop" : collection}
//删除当前数据库所有数据
{"dropDatabase" : 1}
//删除集合里指定的索引
{"dropIndexes" : collection, "index" : name}
分享到:
评论

相关推荐

    java 操作mongodb 增删改查

    本教程将详细介绍如何使用Java进行MongoDB的基本操作,包括增(添加数据)、删(删除数据)、改(修改数据)和查(查询数据)。 首先,你需要在项目中引入MongoDB的Java驱动程序。目前最新的稳定版本是`mongodb-...

    Java操作MongoDB之CRUD(增删改查)

    这篇博文“Java操作MongoDB之CRUD(增删改查)”主要探讨了如何使用Java驱动程序来执行基本的数据库操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)。 首先,我们来了解MongoDB的Java驱动...

    java连接mongodb的jar包

    MongoDB Java驱动提供了丰富的API来进行数据操作,如插入文档、查询数据、更新记录和删除记录等。例如,插入文档可以使用如下代码: ```java MongoCollection&lt;Document&gt; collection = database.getCollection(...

    Java连接mongoDB需要的jar包

    通过这个驱动,Java应用程序可以执行诸如创建、读取、更新和删除(CRUD)等操作。此JAR文件包含了连接管理、命令执行、数据转换等功能。 3. **mongodb-driver-core-3.9.1.jar**:这是驱动程序的核心库,包含了与...

    Java操作mongoDB使用文档.docx(16页.docx

    在本文档中,我们将探讨如何使用Java驱动程序进行基本的MongoDB操作,包括连接、添加、更新、查询和删除数据。 首先,开始之前,确保你已经安装了MongoDB服务器并在本地或远程运行(例如localhost:27017),并且在...

    jdbc java mongodb mysql 相互同步

    对于MongoDB,Java也提供了一个驱动叫做MongoDB Java Driver,它允许我们通过JDBC的类似方式操作NoSQL数据库。引入依赖后,我们可以创建MongoClient并连接到MongoDB数据库: ```java MongoClient mongoClient = new...

    mongodb java Driver

    它提供了一组丰富的API,使得在Java应用程序中执行CRUD(创建、读取、更新、删除)操作变得简单而高效。MongoDB是一个分布式文档存储数据库,而Java驱动程序则是连接MongoDB服务器与Java应用程序之间的桥梁。 首先...

    JAVA操作MongoDB

    ### JAVA操作MongoDB知识点详解 #### 1. Java操作MongoDB简介 MongoDB是一种面向文档的NoSQL数据库,它提供了灵活的文档模型和高性能的读写操作,非常适合处理大量的数据和快速迭代的开发环境。而Java是一种广泛...

    mongodb_java_2.6_API

    MongoDB的Java驱动程序是Java开发者与MongoDB服务器通信的桥梁,它提供了丰富的API,使得在Java应用中执行CRUD(创建、读取、更新、删除)操作变得简单。2.6版本是历史版本,但仍然包含了许多核心功能,如连接管理...

    java操作mongodb增删改查

    本文将详细介绍如何使用Java对MongoDB执行基本的CRUD(创建、读取、更新、删除)操作,并探讨一些高级查询技巧。 #### 二、环境搭建与基础配置 在开始之前,确保已经安装了MongoDB服务并正确启动。接下来,我们需要...

    java连接Mongodb进行增删改查_java连接Mongodb进行增删改查_curiousjop_depthklb_Mong

    本篇文章将详细讲解如何使用Java连接到MongoDB数据库,并进行基本的增删改查操作。 首先,连接MongoDB需要引入MongoDB的Java驱动程序。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    基于java的mongodb实例,代码demo

    在Java开发环境中,我们可以利用Java驱动程序与MongoDB进行交互,实现数据的增删查改操作。下面我们将深入探讨如何在Java中使用MongoDB。 首先,你需要在项目中引入MongoDB的Java驱动程序。通常,我们会使用Maven或...

    java-mongodb底层封装

    在Java开发中,MongoDB是一个常用的NoSQL数据库,以其灵活性、高性能和易扩展性而备受青睐。本项目针对MongoDB进行了底层封装,旨在提供一套简洁、高效的API,使得开发人员可以更加便捷地进行数据的增删查改操作,...

    mongodb java简单demo

    本篇将详细介绍如何使用Java连接MongoDB,以及进行基本的数据操作:创建集合、添加文档、修改文档、查询文档和删除文档。 首先,为了连接MongoDB,我们需要引入MongoDB的Java驱动程序依赖。在Maven项目中,可以在...

    MongoDB、Java与对象关系映射

    ### MongoDB、Java与对象关系映射 #### MongoDB简介与特性 MongoDB作为一种强大的NoSQL数据库,在处理非结构化数据方面有着显著的优势。它通过使用JSON(JavaScript Object Notation)格式来存储和检索数据,简化...

    Mongodb的并发访问性能测试的java客户端

    总结来说,这个Java客户端为MongoDB并发访问性能测试提供了一个实用工具,涵盖了查询、修改和插入操作。它利用Java的并发机制和MongoDB的Java驱动,帮助用户评估数据库在高并发环境下的性能。通过分析和优化这个...

    MongoDB 3.0 速上手教程(JAVA)

    如果你的MongoDB运行在其他主机或非标准端口上,记得修改相应参数。 然后,通过`MongoClient`获取到你想要操作的数据库: ```java MongoDatabase database = mongoClient.getDatabase("myDatabase"); ``` `...

    Java mongodb CRUD 操作代码

    在本文中,我们将深入探讨如何使用Java进行MongoDB的基本CRUD操作,以及如何处理图片的存储、读取和删除。MongoDB是一个流行的NoSQL数据库,它以JSON格式存储数据,而Java是与其交互的常用编程语言。让我们开始探索...

Global site tag (gtag.js) - Google Analytics