环境: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();//删除文档集合