环境:win7
mongo-java-driver:mongo-java-driver-2.11.2.jar
一、Mongo Shell
1、MongoDB连接
MongoDB提供一个完整的JS环境,通过mongo shell命令来操作MongoDB数据库。
本地:>mongo (默认连接本地数据库,端口:27017)
其他机器:>mongo --port port --host ip(或者:mongo host : port)
连接成功后,默认连接的是test数据库,
输入db可以查看当前使用的是哪个数据库
2、查看数据库信息
>show dbs(或者:show databases(Version 2.4支持)) //列出所有的数据库
>use databaseName //选择要操作的数据库
通过help命令可以查询帮助信息。
3、C(create)R(read)U(update)D(delete)
(1)C(create):创建一个集合(Collection,类似于RDBMS中的数据表),并插入一条记录
> m = {name:"hello mongo"}
> db.mongodb_shell.insert(m);//向名为mongodb_shell的集合中插入一条记录,如果该集合在当前数据库中不存在,那么将自动创建该名称的集合。
>db.mongodb_shell.insert({"name":"hello mongo","desc":"mongodb crud","status":["mongo","crud"]});
> db.mongodb_shell.insert({"name":"hello mongo","desc":"mongodb crud","status":{"name":"mongo","tag":"crud"}});
查看集合是否存在,可以通过>show collections;(或者show tables;)命令查看,执行查询命令后,可以看到有一个system.indexes集合,这是每个MongoDB数据库都会有的。
除了使用shell命令外,还可以通过javascript函数来插入记录:
function insertDocument(dbname,collname) {
var dbcoll = db.getSiblingDB(dbname).getCollection(collname);
dbcoll.insert({"name":"hello mongo"});
printjson(dbcoll.count());
}
//调用方法
insertDocument("mongodb_test","mongodb_shell"); db.collection.insert()和db.collection.save();的区别:
1)insert()保存记录时,要插入的文档的_id值必须在集合中是独一无二的(如果使用MongoDB默认的_id是不会出现重复的,但是,如果使用自定的_id就需要考虑_id值重复的问题了),否则就会出现com.mongodb.MongoException$DuplicateKey错误
2)save()保存记录时,如果集合中存在和要插入的文档相同的_id值的文档记录,那么就会执行更新操作,如果不存在,就执行插入操作。
(2)R(read):查询集合中的记录
>db.mongodb_shell.findOne();//查询一条记录
>db.mongodb_shell.find();//查询所有,默认显示前20条记录,如果记录总数超过20条,可以通过>it来查询更多的记录。
>db.mongodb_shell.find({"name":"hello mongo"});//根据条件查询指定的文档记录
>db.mongodb_shell.find().limit(10);//只查询10条记录
例如:
> db.mongodb_shell.findOne();
{ "_id" : ObjectId("52e74f7a95009070292b68af"), "name" : "hello mongo" }
> db.mongodb_shell.find();
{ "_id" : ObjectId("52e74f7a95009070292b68af"), "name" : "hello mongo" }
{ "_id" : ObjectId("52e74fb27b5ffeda466a9e55"), "name" : "hello mongo" } 循环插入数据:
for(var i=1;i<25;i++) {
db.mongodb_shell.insert({"i":i})
};
var cursor = db.mongodb_shell.find();//返回一个游标,
printjson(cursor[1]);//打印出索引为1的文档。//下标从0开始
在返回的记录中,我们可以看到有一个"_id"值,我们之前的操作中并没有插入过_id,那么它是怎么生成的呢?关于这个特殊的值,此文中不作论述,
可以参考:
1、官方文档:docs.mongodb.org/manual/reference/object-id/
2、http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html
这里只是介绍了一些简单的查询,稍后还会专门写一篇关于MongoDB查询的博文。
(3)U(update)
version2.2之前:db.collection.update( <query>, <update>, <upsert>, <multi> )
version2.2开始:
db.collection.update(
<query>,
<update>,
{ upsert: <boolean>, multi: <boolean> }
) 操作示例:
> db.mongodb_shell.insert({"name":"hello mongo","desc":"mongodb crud","status":{"name":"mongo","tag":"crud"}});
> db.mongodb_shell.findOne();
{
"_id" : ObjectId("52e75cfd7b5ffeda466a9ec2"),
"name" : "hello mongo",
"desc" : "mongodb crud",
"status" : {
"name" : "mongo",
"tag" : "crud"
}
}
> db.mongodb_shell.update(
{
"name" : "hello mongo",
"desc" : "mongodb crud",
"status" : {
"name" : "mongo",
"tag" : "crud"
}
},
{
"name" : "hello mongo",
"desc" : "mongodb crud",
"status" : {
"name" : "new mongo",
"tag" : "new crud"
}
},{upsert:true});
//更新后
> db.mongodb_shell.findOne();
{
"_id" : ObjectId("52e76b8f7b5ffeda466a9ed2"),
"name" : "hello mongo",
"desc" : "mongodb crud",
"status" : {
"name" : "new mongo",
"tag" : "new crud"
}
}
(4)D(delete)
db.mongodb_shell.remove();//删除所有
db.mongodb_shell.remove({"name":"hello mongo"});//删除满足条件的记录
db.mongodb_shell.remove({"name":"hello mongo"},1);或者db.mongodb_shell.remove({"name":"hello mongo"},true);//删除满足条件的单条记录
二、Java API
1、MongoDB连接
MongoClient mongo = new MongoClient();//不指定host和port,默认使用本地数据库,端口:27017
MongoClient mongo = new MongoClient(host, port); 2、查看数据库信息
List<String> dbList = mongo.getDatabaseNames();//返回所有数据库名
DB db = mongo.getDB(dbname);//获取指定名称的数据库对象
Set<String> dbcollList = db.getCollectionNames();//返回数据库的集合信息
DBCollection dbcoll = db.getCollection(collname);//获取指定名称的集合对象
3、C(create)R(read)U(update)D(delete)
DBObject dbo = new BasicDBObject();
dbo.put("_id",1);
dbo.put("name","mongo");
dbo.put("desc", "hello mongo");
(1)C(create)
dbcoll .insert(dbo);
dbcoll .save(dbo);//save()和insert()的区别已经在上文中做过介绍
(2)R(read)
DBCursor cursor = dbcoll.find();
遍历:
while(cursor.hasNext()) {
DBObject dbo = cursor.next();
System.out.println(dbo);
}
DBObject one = dbcoll.findOne();
DBCursor cursor = dbcoll.find(new BasicDBObject("name","hello mongo"));
DBObject one = dbcoll.findOne(new BasicDBObject("name","hello mongo"));
(3)U(update)
DBObject new_dbo = new BasicDBObject();
new_dbo.put("name","mongo");
new_dbo.put("desc", "hello mongo");
DBObject query = new BasicDBObject();
query.put("_id", 1);
query.put("name", "mongo");
dbcoll.update(query,new_dbo);//更新满足条件的单个文档
dbcoll.updateMulti(query,new_dbo);//更新满足条件的多个文档
注意:更新操作中,不会更新_id字段。
(4)D(delete)
WriteResult wr = dbcoll.remove(query);
wr.getN();//返回操作的记录数
db.dropDatabase();//删除数据库
dbcoll.drop();//删除文档集合