zoukankan      html  css  js  c++  java
  • MongoDB学习

    问题解决

    1、由于目标计算机积极拒绝 无法连接

    原因:还没有启动mongodb,就使用mongo命令

    解决方法:在bin目录下输入

    mongod --dbpath XXXX/data 然后在输入 mongo

    一、基础操作

    每条对特定表的操作都需要以 db.表名 开头,如插入操作 db.person.insert({"属性":"值"}),下面省略 db.表名

    1、打开mongo shelll命令

    mongo 
     
    2、插入记录

    insert({“属性”:”值”})

    3、查找全部记录/一条记录

    find()
    find().limit(1)

    4、根据条件查找记录

    find({“name”:”value”})

    5、更新记录

    update({查找条件},{更新后属性值})
      
    6、删除记录

    remove({查找条件})

    对整个mongo数据库进行操作,以下不需要加db.表名

    7、查询目前存在的所有数据库

    show dbs;
    8、切换数据库(和mysql中方法相同)

    use 数据库名;
      

    二、插入操作

    可以用一些javascript的语法

    
    var single = {“key”:”value”,”key”:{“key”:”value”}}
    insert(single)
    
    

    也可以用single.key = “value”,对single进行修改

    三、查询操作
    (1)
    >,<,>=,<=,!= 对应着 (gt,)lt,(gte,)lte,$ne,如

    
    find({"age":{$lte:22}})
    
    

    (2)
    And,Or,In,notIn 对应着 (用逗号隔开即可)、 (or、)in、$nin

    
    db.person.find({$or:[{"sex":"girl"},{"age":23}]})
    
    

    
    db.person.find({"address.province":{$in:["anhui","jiejiang"]}})
    
    

    
    db.person.find({"address.city":{$nin:["shenzhen","hangzhou"]}})
    
    

    (3)正则

    以j开头,以1结尾的
    ```

    db.person.find({"name":/^j/,"name":/1$/})

    (4)
        ```
    
    db.person.find({$where:function(){return this.age=18}})
    
    

    四、更新

    (1)$inc修改器
    年龄在原先基础上加12,不存在属性值则会新建

    
    db.person.update({"name":"while snow"},{$inc:{"age":12}})
    
    

    (2)$set修改器
    更新为设定的值
    (3)upset操作
    不存在则新建,用法只需将update的第三个参数设置为new

    
    db.person.update({"name":"new"},{$inc:{"age":1}},true)
    
    

    五、聚合、游标

    sql中的聚合操作有group、count、distinct
    (1)count

    
    db.person.count({"age":16})
    
    

    (2)distinct

    
    db.person.distinct("age")
    
    

    (3)group
    cur为当前文档对象,prev为上一次function的累计对象(第一次为initial中的"person":[],这里的person就是输出的集合名)

    例1:

    
    db.person.group({
    "key":{"age":true},
    "initial":{"person":[]},
    "$reduce":function(cur,prev){prev.person.push(cur.name);}
    })
    
    

    例2:

    
    db.person.group(
    {
    "key":{"age":true},
    "initial":{"sex":[]},
    "$reduce":function(cur,prev){prev.sex.push(cur.sex);}
    }
    )
    
    

    过滤age大于18的,并且标明每一个集合中的人数
    condition为过滤条件,finalize每组执行完后触发这个函数达到计数的目的

    db.person.group({
    “key”:{“age”:true},
    “initial”:{“person”:[]}
    “reduce”:function(doc,out){out.person.push(doc.name);},
     “finalize”:function(out){out.count=out.person.length;},
    “condition”:{“age”:{$lt:18}}
    })
    

    六、mapreduce

    map 映射函数,对选定的key进行分组,这里是以name来进行分组的

    > var map = function(){
    … emit(this.name,{count:1});
    … }
    
    

    map 归约函数,对map分组后的数据进行分组简化

    
    > var reduce = function(key,value){
    … var result = {count:0};
    … for(var i = 0;i<value.length;i++){
     ... result.count += value[i].count;}
    ... return result;
    ... }
    
    

    emit为调用的次数,result存放的集合名,input传入的文档数,output输出的文档数,reduce函数被调用的次数

    
    > db.person.mapReduce(map,reduce,{“out”:”collection”})
    {
    “result” : “collection”,
    “timeMillis” : 24,
    “counts” : {
    “input” : 6,
    “emit” : 6,
    “reduce” : 2,
    “output” : 4
    },
    “ok” : 1,
    }
    
    

    db.collection.find()
    { “_id” : “jack”, “value” : { “count” : 2 } }
    { “_id” : “will”, “value” : { “count” : 1 } }
    { “_id” : “jone”, “value” : { “count” : 1 } }
    { “_id” : “mike”, “value” : { “count” : 2 } }

    七、游标
    var list = db.person.find();
    其实也就是将查询语句赋值给变量,只要枚举过一次,游标就会销毁,比如输入list或list.forEach(function(x){print(x.name);})
    之后再输入list,就不会看到有返回结果

    一、
    1、插入10w条数据

    for(var i = 0;i<100000;i++){
    ... var rand = parseInt(i*Math.random());
    ... db.person.insert({"name":"hxc"+i,"age":i})
    ... }
    2、使用性能分析函数explain
    db.person.find({“name”:”hxc”+1000}).explain()
    {
    “cursor” : “BasicCursor”, //表扫描,也就是顺序查找
    “isMultiKey” : false,
    “n” : 1, //返回了一个文档
    “nscannedObjects” : 100006, //浏览的文档数
    “nscanned” : 100006,
    “millis” : 58, //总共耗时58毫秒
    }
    3、建立索引

    > db.person.ensureIndex({“name”:1})
    > db.person.find({“name”:”hxc”+1000}).explain()
    {
    “cursor” : “BtreeCursor name_1″,采用B树结构存储索引,索引名为”name_1″
    “isMultiKey” : false,
    “n” : 1,
    “nscannedObjects” : 1,
    “nscanned” : 1, //!!!!
    “nscannedObjectsAllPlans” : 1,
    “nscannedAllPlans” : 1,
    “nChunkSkips” : 0,
    “millis” : 0, //!!!!
    }
    

    二、
    1、唯一索引
    建立唯一索引,重复键值不能输入。唯一索引也不能再已经存在重复键值的表上创建

    db.person.ensureIndex({“name”:1},{“unique”:true})。
    

    2、组合索引

    > db.person.ensureIndex({“name”:1,”birthday”:1})
    > db.person.ensureIndex({“birthday”:1,”name”:1})
    

    查看生成的索引

    > db.person.getIndexes()
    {
    “v” : 1,
    “key” : {
    “name” : 1,
    “birthday” : 1
    },
    “ns” : “test.person”,
    “name” : “name_1_birthday_1″
    },
    {
    “v” : 1,
    “key” : {
    “birthday” : 1,
    “name” : 1
    },
    “ns” : “test.person”,
    “name” : “birthday_1_name_1″
    }
    

    3、删除索引

    > db.person.dropIndexes(“name_1″)
    {
    “nIndexesWas” : 4,
    “msg” : “non-_id indexes dropped for collection”,
    “ok” : 1
    }
    

    相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多。通过一个简单的样例,很容易地就可以上手

    一、导入Jar包
    添加Monog支持Java的jar包,这里使用的是2.9.3

    org.mongodb mongo-java-driver 2.9.3

    二、一个简单的样例
    // 连接到mongodb
    Mongo mongo = new Mongo("localhost", 27017);
    // 打开数据库test
    DB db = mongo.getDB("test");
    //获取表,emp为表的名字,若表不存在则会自行创建
    DBCollection coll = db.getCollection("emp");
    //创建记录对象,append的作用是添加属性值
    BasicDBObject doc = new BasicDBObject("name", "fzj").append("sex",
    "man");
    //在数据库表中添加记录
    coll.insert(doc);
    三、自己写的接口实现类(CURD)
    通过上面的简单样例,只要接触过数据库和了解一些Mongo的语法。相信接口实现类很容易看懂

    public class DBImpl implements DBTool {
    
    	static DB db;
    	static {
    
    		Mongo mongo;
    		try {
    			mongo = new Mongo("localhost", 27017);
    			db = mongo.getDB("test");
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		}
    	}
    
    	@Override
    	public void insert(String tableName, BasicDBObject dbObject)
    			throws UnknownHostException {
    		DBCollection coll = db.getCollection(tableName);
    		coll.insert(dbObject);
    	}
    
    	@Override
    	public void delete(String tableName, BasicDBObject dbObject)
    			throws UnknownHostException {
    		DBCollection coll = db.getCollection(tableName);
    		coll.remove(dbObject);
    	}
    
    	@Override
    	public void update(String tableName, BasicDBObject docFind,
    			BasicDBObject doc) throws UnknownHostException {
    		DBCollection coll = db.getCollection(tableName);
    		coll.update(docFind, doc);
    	}
    
    	@Override
    	public DBObject find(String tableName, BasicDBObject dbObject)
    			throws UnknownHostException {
    		DBCollection coll = db.getCollection(tableName);
    		return (DBObject) coll.find();
    	}
    
    }
    
    

    一、DBObject 转为 JavaBean

    
       /**
         * 将实体Bean对象转换成DBObject
         * 
         */
        public static <T> DBObject beanToDBObject(T bean)
                throws IllegalArgumentException, IllegalAccessException {
            if (bean == null)
                return null;
            DBObject dbObject = new BasicDBObject();
            // 获取对象类的属性域
            Field[] fields = bean.getClass().getDeclaredFields();
            for (Field field : fields) {
                // 获取变量的属性名
                String varName = field.getName();
                // 修改访问控制权限
                boolean accessFlag = field.isAccessible();
                if (!accessFlag) {
                    field.setAccessible(true);
                }
                Object param = field.get(bean);
                if (param == null) {
                    continue;
                } else if (param instanceof Integer) {
                    // 判断变量的类型
                    int value = ((Integer) param).intValue();
                    dbObject.put(varName, value);
                } else if (param instanceof String) {
                    String value = (String) param;
                    dbObject.put(varName, value);
                } else if (param instanceof Double) {
                    double value = ((Double) param).doubleValue();
                    dbObject.put(varName, value);
                } else if (param instanceof Float) {
                    float value = ((Float) param).floatValue();
                    dbObject.put(varName, value);
                } else if (param instanceof Long) {
                    long value = ((Long) param).longValue();
                    dbObject.put(varName, value);
                } else if (param instanceof Boolean) {
                    boolean value = ((Boolean) param).booleanValue();
                    dbObject.put(varName, value);
                } else if (param instanceof Date) {
                    Date value = (Date) param;
                    dbObject.put(varName, value);
                }
                // 恢复访问控制权限
                field.setAccessible(accessFlag);
            }
            return dbObject;
        }
    

    二、 JavaBean转为DBObject

    
          /**
         * 将DBObject转换成Bean对象
         * 
         */
        public static <T> T dbObjectToBean(DBObject dbObject, T bean)
                throws IllegalAccessException, InvocationTargetException,
                NoSuchMethodException {
            if (bean == null) {
                return null;
            }
            Field[] fields = bean.getClass().getDeclaredFields();
            for (Field field : fields) {
                String varName = field.getName();
                Object object = dbObject.get(varName);
                if (object != null) {
                    BeanUtils.setProperty(bean, varName, object);
                }
    
            }
            return bean;
        }
    
        // 取出Mongo中的属性值,为bean赋值
        public static <T> void setProperty(T bean, String varName, T object) {
            varName = varName.substring(0, 1).toUpperCase() + varName.substring(1);
            try {
                String type = object.getClass().getName();
                // 类型为String
                if (type.equals("java.lang.String")) {
                    Method m = bean.getClass().getMethod("get" + varName);
                    String value = (String) m.invoke(bean);
                    if (value == null) {
                        m = bean.getClass()
                                .getMethod("set" + varName, String.class);
                        m.invoke(bean, object);
                    }
                }
                // 类型为Integer
                if (type.equals("java.lang.Integer")) {
                    Method m = bean.getClass().getMethod("get" + varName);
                    String value = (String) m.invoke(bean);
                    if (value == null) {
                        m = bean.getClass().getMethod("set" + varName,
                                Integer.class);
                        m.invoke(bean, object);
                    }
                }
                // 类型为Boolean
                if (type.equals("java.lang.Boolean")) {
                    Method m = bean.getClass().getMethod("get" + varName);
                    String value = (String) m.invoke(bean);
                    if (value == null) {
                        m = bean.getClass().getMethod("set" + varName,
                                Boolean.class);
                        m.invoke(bean, object);
                    }
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    

    参考文档

    [1] 《mongodb-java-driver基本用法》 http://www.cnblogs.com/yjmyzz/p/3865175.html
    [2] 《8天学通MongoDB》 http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html

  • 相关阅读:
    【.Net--资料】
    【系统Configmachine.config与自己的应用程序的App.config/Web.Config配置节点重复】解决方法
    【AutoMapper】实体类间自动实现映射关系,及其转换。
    【EntityFramwork--处理数据并发问题】
    【IOC--Common Service Locator】不依赖于某个具体的IoC
    Android学习——碎片Fragment的使用
    Android学习——利用RecyclerView编写聊天界面
    Android学习——控件ListView的使用
    Android学习——LinearLayout布局实现居中、左对齐、右对齐
    Android学习——Button填充颜色及实现圆角
  • 原文地址:https://www.cnblogs.com/fonxian/p/10276848.html
Copyright © 2011-2022 走看看