mongDB基本命令和Java操作MongoDB
上一篇博文《mongoDB 安装》我们安装了 mongoDB,现在来复习一下它的一些基本命令:
mongoDB 的 bin 目录加入到 path 之后,命令行中输入 mongo:
然后我们进入正题
1、查看有哪些数据库:
show dbs |
我们可以看见有两个库,一个是之前做即时通讯系统测试的 chat 库,一个是 local 库。
2、切换数据库
use chat |
如上命令我们切换到即时通讯系统的库:
3、查看数据集合:
show collections |
使用上面的命令,可以查看我们即时通讯系统的 chat 库中的所有数据集合。我们可以看见一些诸如存放消息的 msg 集合、存放用户信息的 users 集合,以及存放索引信息的 system.indexes 集合。
4、使用帮助命令:
*.help() |
这里的 * 可以是数据库、数据集合等。
如数据库:
db.help() |
可以看见一些常见的操作如 addUser 添加用户、getCollectionNames 获取数据集合名称等等。
或者数据集合的:
db.chat.help() |
我们可以看见经常用到的命令:
保存 save()、删除 remove()、查询 find()、计数 count()、删除 drop()、排序 sort()、类似于 MySQL 的 limit() 等等方法,而且给出了一些例子和简单的语法说明。
5、插入 save()/insert()
先看 save,从上面的 help 中我们看见,save 和 insert 都接受一个 obj 对象。我们用类似于 Actionscript/Javascript 的方式声明一个对象,然后保存:
db.msg.save({_id:1,from:"zhangsam",to:"lisi",msg:"hello world!",time:"1373615052442"}) //保存一条张三对李四说的消息,内容为 "hello world!",同时保存一个时间戳。
然后我们使用 find 命令查一下,可以看见我们的数据保存进去了:
db.msg.find() |
然后我们试着使用 insert 插入一条 _id 仍然为 1 的数据,看看会出现什么:
db.msg.insert({_id:1,from:"lisi",to:"zhangsan",msg:"hello,zhangsan!",time:"1373615052442"}) //尝试插入一条李四对张三说的话
然后可以发现报错了。告诉我们 chat 库的 msg 集合的 _id 的索引重复了。
我们在试试使用 save 命令:
db.msg.save({_id:1,from: "lisi" ,to: "zhangsan" ,msg: "hello,zhangsan!" ,time: "1373615052442" }) |
没有错误信息,然后使用 find 命令查询 msg 集合中的数据:
我们可以看出,之前保存的信息被修改了,也就是insert 命令是插入操作,id 重复时会报错。save 命令是 saveOrUpdate 的意思,id 重复时会更新。
6、find 命令
一般数据库的查询是最常用也最复杂的,MongoDB 也不例外,我们来看看一些例子:
6.1 最简单的查询
db.users.find() |
这是系统测试时的部分数据,因为隐私的问题,屏蔽了一些信息,仅供演示。
上面的命令会自动显示数据集合中前 20 条数据。使用it 命令,会将游标指向下 20 条数据。
6.2 带简单参数的查询:
我们来查询上面表中的系统管理员,他的 "userId" 是 USER0000000000000000000000000001。
使用如下命令:
db.users.find({ "userId" : "USER0000000000000000000000000001" }); |
从下面的图中我们可以看见,用户编号为 USER0000000000000000000000000001 的“系统管理员”被我们查出来了。
6.3 多个参数的查询:
6.3.1 or
比如我们要查“国际注册处”或者“异议裁定一处”的所有用户,使用类似于 SQL 中的 or:
db.users.find({$or:[{orgName: "国际注册处" },{orgName: "异议裁定一处" }]}) |
我们可以看见,测试数据中的四个操作者被查出来了。
6.3.2 and
用法类似于 or,我们使用如下命令来查询异议裁定一处的名为欧阳 XX 的用户
db.users.find({$and:[{userName: "欧阳XX" },{orgName: "异议裁定一处" }]}) |
下图是结果:
6.4 操作符
查找用户编码大于 00003198 的所有用户:
使用$gt是大于的意思
db.users.find({userId:{$gt: "00003198" }}) |
如下结果:
编号大于 00003198 的所有用户被查出来了:
此外类似的操作符还有:$gte是≥、 $lt是<、$lte是≤,$ne是!=
如:
> db.msg.find({_id:{$ne:2}}) |
以此类推,不再逐一赘述。
7、count 命令
对一个查询进行计数:
> db.users.find({userId:{$gt: "00003198" }}).count() |
显示这个查询的结果是 7 条。
同时也可以使用:
db.users.count({userId:{$gt: "00003198" }}) |
两种方式结果相同:
8、sort 命令:
语法:query.sort({字段 A:-1/1})
将一个查询使用字段 A 的降序、升序排列:
db.users.find({userId:{$gt: "00003198" }}).sort({userId:1}) db.users.find({userId:{$gt: "00003198" }}).sort({userId:-1}) |
下图是两种操作的结果:
主要的命令就介绍这么多,其他的 update、remove、skip、limit 命令大多类似于 find 或相对比较简单。下面我们说说在 Java 中使用这些命令。
Java 中使用 MongoDB
Java 使用 MongoDB 非常方便,下面是简单的步骤。
1、官网下载驱动,我们使用的是mongo-java-driver-2.9.3.jar
2、获取数据库连接实例
public static void initDB(){ try { InputStream bin = Object.class.getResourceAsStream("/db.properties"); p.load(bin); mongo = new Mongo(p.getProperty("MONGO_IP"),Integer.parseInt(p.getProperty("MONGO_PORT"))); mongo.getMongoOptions().connectionsPerHost = Integer.parseInt(p.getProperty("MAX_SIZE"));
} catch (FileNotFoundException e) {e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }finally{
if(bin != null){
bin.close();
}
}
}
3、获取 DBCollection 数据集合
DBCollection msgCol = mongo.getDB(p.getProperty("DB_NAME")).getCollection("msg");
DBCollection userCol = mongo.getDB(p.getProperty("DB_NAME")).getCollection("users");
4、演示一个 save 的方法
public void saveMsg(Msg msg){ if(msg == null){ return; } DBObject obj = new BasicDBObject(); obj.put("from", msg.from); obj.put("to", msg.to); obj.put("time", Long.parseLong(msg.time)); obj.put("toName", msg.toName); obj.put("msg", msg.msg); obj.put("userId", msg.userId); obj.put("userName", msg.userName); obj.put("orgId", msg.orgId); obj.put("orgName", msg.orgName); obj.put("type", msg.type); msgCol.save(obj); }
备注:如果要指定 id,可以使用 ObjectId 对象
5、演示一个使用or操作符的查询:
@SuppressWarnings("unchecked") public String getChatLog(Msg msg) { Map<String, Object> map = (Map<String, Object>)JSON.parse(msg.data); BasicDBList list = new BasicDBList(); //out DBObject out = new BasicDBObject("to", map.get("targetId")); out.put("from", msg.from); list.add(out); //in DBObject in = new BasicDBObject("from", map.get("targetId")); in.put("to", msg.from); list.add(in); DBObject query = new BasicDBObject("$or", list); DBCursor cursor = msgCol.find(query).skip(Integer.parseInt(map.get("skip").toString())).limit(Integer.parseInt(map.get("limit").toString())); DBObject each; StringBuffer sb = new StringBuffer("["); while(cursor.hasNext()){ each = cursor.next();
//DBobject 是一个类似于 map 的东西,可以在这里 get 出来,然后处理业务逻辑 ...Code... }
其他的方法类似于上面的操作。
写在最后:
以上只是一个入门吧,其实 MongoDB 的 Map-Reduce 和aggregate 运算比较强大,适合进行大数据量的运算,以后有时间看看。