问题解决
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
二、一个简单的样例
// 连接到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