MONGO的简单语法,新手实用

window上启动方式:(简单略)

mongod --dbpath E:study_libmongodbdb --port=27000

show dababases;
(创建配置文件的启动方式)
mongod -f E:study_libmongodbmongodb.conf

一、常用命令:
查看当前所用的用户:
db
查所有数据库列表:
show databases;或者 show dbs;
查所有的表:
show collections;
删除当前连接的数据库:
db.dropDatabase();
删除集合(表)
db.dept.drop();
新增集合(表):
for(var i =0; i <20;i++){
db.createCollection("log"+i )};
备份(存放目录在当前文件夹下的backup目录下):
C:UsersAdministrator.SC-201605302031>mongodump -d infos -o backup -port 27001
还原:
C:UsersAdministrator.SC-201605302031>mongorestore -d infos2 --drop backup/infos -port 27001

二、增删改查操作
--插入数据
var deptDate = {
"deptno":20,
"dname" : "研发部",
"acount" : "20人",
"avg" : 8000
};
db.dept.insert(deptDate);
--查询数据
db.dept.find();
--删除数据
db.dept.remove({"_id":ObjectId("5850ba7eda14e47aa0d9174a")});
--更新数据

var deptDate = {
"deptno":222,
"dname" : "家里蹲",
"acount" : "22人",
"avg" : 10000
};
db.dept.insert(deptDate);
(更新值)
var deptDate = {
"deptno":333,
"dname" : "家里蹲",
"acount" : "33人",
"avg" : 10000
};
db.dept.update({"_id":ObjectId("5850bbe6da14e47aa0d9174b")},deptDate);

三、数据操作(重点)
除了增加外,其他都很麻烦。

1.数据增加
查询的核心语法:
db.集合.insert();
db.infos.insert({"url":"www.baidu.com"});
增加10000条,javascript脚本
for(var x =0; x< 10000 ;x++){
db.infos.insert({"url":"www.baidu"+x+".com"});
};

2.数据的查询操作
mongo的数据库的关系运算、逻辑运算、数组运算、正则运算
查询的核心语法:
db.集合名称.find({查询条件}[,{设置显示的字段}]);
第二个参数 0不显示,1显示(默认);
db.infos.find({},{"_id": 0,"url":1});
db.infos.find({"url":"www.baidu.com"},{"_id": 0});

pretty()函数,美化显示;
db.infos.find({"url":"www.baidu.com"},{"_id": 0}).pretty();
db.infos.findOne({"url":"www.baidu.com"},{"_id": 0}).pretty();

关系查询(大于$gt 大于等于$gte 不等于$ne 小于等于$lte 等于key :value)
db.student.drop();
db.student.insert({"name":"张三","age":19,"sex":"男","address":"盐城市"});
db.student.insert({"name":"张四","age":29,"sex":"男","address":"盐城市"});
db.student.insert({"name":"张五","age":39,"sex":"男","address":"盐城市"});
db.student.insert({"name":"张六","age":49,"sex":"女","address":"盐城市"});
db.student.insert({"name":"张七","age":59,"sex":"男","address":"盐城市"});
db.student.insert({"name":"张八","age":69,"sex":"男","address":"盐城市"});

db.student.find({"name":"张三"}).pretty();
db.student.find({"sex":"男"}).pretty();
关系运算与之前最大的区别就是,在json结构中再定义一个json结构:
db.student.find({"age":{"$gte":59}}).pretty(); 年龄大于等于59的学生
db.student.find({"age":{"$lte":59}}).pretty(); 年龄小于等于59的学生
db.student.find({"age":{"$gte":59,"$lte":69}}).pretty(); 年龄大于等于59且小于等于69的学生

逻辑运算:
逻辑运算主要就是三种类型:与($and) 或($or) 非($not $nor)
除了or之外,and和not都可以用关系查询来进行;所以这里只列出“or”的写法
逻辑运算“or”,需要给语句设置数组的过滤条件(多个都用[])
db.student.find({"$or":[
{"age":{"$gt": 39}},
{"sex": "女"}]});
db.student.find({"$nor":[
{"age":{"$gt": 39}},
{"sex": "女"}]});

求模操作:
{"$mod" :[数字,余数]}
db.student.find({"age":{"$mod" : [3,0]}}); 被3整除
查询范围:
{"$in" :[数字,余数]}
db.student.find({"age":{"$in" : [19,69]}});
{"$nin" :[数字,余数]}
db.student.find({"age":{"$in" : [19,69]}});
数组查询:
集合参数:var colls = ["12","23"]
先存一部分的数组内容:
db.student.insert({"name":"李三","age":19,"sex":"男","address":"锡城市","course":["语文","体育","音乐"]});
db.student.insert({"name":"李四","age":29,"sex":"男","address":"锡城市","course":["语文","数学","体育"]});
db.student.insert({"name":"李五","age":39,"sex":"男","address":"锡城市","course":["语文","数学","音乐"]});
db.student.insert({"name":"李六","age":49,"sex":"女","address":"锡城市","course":["语文","体育","音乐"]});
db.student.insert({"name":"李七","age":59,"sex":"男","address":"锡城市","course":["语文","数学","体育","音乐"]});
db.student.insert({"name":"李八","age":69,"sex":"男","address":"锡城市","course":["数学","体育","音乐"]});

查询同时参加数组中语文呢和数学的学生:
db.student.find({"course":{"$all" : ["语文","数学"]}}).pretty();
也可以查询非数组字段:
db.student.find({"address":{"$all" : ["锡城市"]}}).pretty();

下标位置查询:
查询数组字段第三个下标为体育的数据”,(index从0开始)
db.student.find({"course.2":"体育"}).pretty();
查询参加4门课程的学生
db.student.find({"course":{"$size":4}}).pretty();
控制数组的返回数量,返回年龄19岁,且只显示前两门课程
db.student.find({"age":19 }, {"course":{"$slice":2}});
控制数组的返回数量,返回年龄19岁,且只显示后两门课程
db.student.find({"age":19 }, {"course":{"$slice":-2}});
控制数组的返回数量,返回年龄19岁,且跳过第一门,返回一门课程名
db.student.find({"age":19 }, {"course":{"$slice":[1,1]}});

嵌套集合运算:
先增加数据:增加家长信息
db.student.insert({"name":"高达三","age":19,"sex":"男","address":"锡城市","parents":[{"name":"高高达三-father" , "age":119,"job":"工人"},
{"name":"高高达三-mather" , "age":119,"job":"工人"}],"course":["语文","体育","音乐"]});
db.student.insert({"name":"高达四","age":29,"sex":"男","address":"锡城市","parents":[{"name":"高高达四-father" , "age":129,"job":"工人"},
{"name":"高高达四-mather" , "age":129,"job":"工人"}],"course":["语文","数学","体育"]});
db.student.insert({"name":"高达五","age":39,"sex":"男","address":"锡城市","parents":[{"name":"高高达五-father" , "age":139,"job":"工人"},
{"name":"高高达五-mather" , "age":139,"job":"工人"}],"course":["语文","数学","音乐"]});
db.student.insert({"name":"高达六","age":49,"sex":"女","address":"锡城市","parents":[{"name":"高高达六-father" , "age":149,"job":"工人"},
{"name":"高高达六-mather" , "age":149,"job":"工人"}],"course":["语文","体育","音乐"]});
db.student.insert({"name":"高达七","age":59,"sex":"男","address":"锡城市","parents":[{"name":"高高达七-father" , "age":159,"job":"工人"},
{"name":"高高达七-mather" , "age":159,"job":"工人"}],"course":["语文","数学","体育","音乐"]});
db.student.insert({"name":"高达八","age":69,"sex":"男","address":"锡城市","parents":[{"name":"高高达八-father" , "age":169,"job":"工人"},
{"name":"高高达八-mather" , "age":169,"job":"局长"}],"course":["数学","体育","音乐"]});
匹配(”$elemMatch“)家长是局长的学生,且学生年龄大于29岁:
db.student.find( {"$and" :[{"age":{"$gt" : 29}},
{"parents":{"$elemMatch":{"job":"局长"}}}]}).pretty();
匹配(”$elemMatch“)家长是局长的学生,或者学生为女性:
db.student.find({"$or":[{"sex":"女"},
{"parents":{"$elemMatch":{"job":"局长"}}}]}).pretty();
所以,由于这种查询条件比较麻烦,如果可能尽量别搞这么复杂的数据结构

判断某个字段是否存在:
"$exists":true/false
查询parents信息的数据:
db.student.find({"parents":{"$exists":true}}).pretty();

查询不具有course信息的数据:
db.student.find({"course":{"$exists":false}}).pretty();

条件过滤:(可以使用javascript查询,相当于将数据库存的json对象,转换成javascript,会使索引失效;所以数据量多的时候不用这个)
"$where"
db.student.find({"$where":"this.age>=69"}).pretty();
等同于:db.student.find(this.age>=69).pretty();

年龄在19到69之间:
db.student.find({"$and" :[{"$where":"this.age>19"},
{"$where":"this.age<69"}
]}).pretty();
年龄在小于等于19或者大于等于69:
db.student.find({"$or" :[{"$where":"this.age>=69"},
{"$where":"this.age<=19"}
]}).pretty();

模糊查询:(正则运算)
正则表达式:兼容Perl
基本语法:{key : 正则标记}
完整语法:{key :{"$regex":正则标记 , "$options":"选项"}}

查询name含有”高“的:不加双引号
db.student.find({"name":/高/});
等同于db.student.find({"name":{"$regex":/高/}});
查询name含有”高“的(不区分大小写):
db.student.find({"name":/高/i});
等同于db.student.find({"name":{"$regex":/高/i}});

查询数组数据:
db.student.find({"course":/语/i});

数据的排序:1 升序 ;-1 降序
db.student.find().sort({"age":-1});
自然排序:$natural按照数据修改时间来排序
db.student.find().sort({"$natural":-1});
--更新一条记录后发现跑到最上面了,所以是按照修改时间来进行排序的,如下
var deptDate = {
"name":"张四",
"age":19,
"sex":"男",
"address":"锡城市",
"course":["语文","体育","音乐"]
};
db.student.update({"name":"张四"},deptDate);

数据的分页显示:
skip(n):表示跨过n行;
limit(n):取出数据行的个数限制,显示N条;
跳5行,显示5行
db.student.find().skip(5).limit(5).sort({"$natural":-1});


数据更新操作:
save();
update();
1.update语法很麻烦:
db.集合.update(更新条件,新的数据,upsert, multi);
-upsert :如果数据存在则更新,不存在则插入;true 为增加 false 则不增加
-multi :表示是否只更新满足条件的第一条数据,如果设置为false,只更新第一个;如果是true,全更新
将年龄19岁的地址都改成北京:
db.student.update({"age":19},{"$set":{"address":"北京市"}},false,true);
查询:db.student.find({"address":"北京市"})

更新不存在的数据:
db.student.update({"age":1},{"$set":{"name":"不存在这个人","address":"北京市"}},true,true);
查询:db.student.find({"address":"北京市"}).sort({"$natural":-1})


Mongo的游标操作:
printjson输出Object型的对象;cursor.hasNext()的返回值是布尔类型
var cursor = db.student.find();
while(cursor.hasNext()){
var doc = cursor.next();
printjson(doc);
}

Mongo的索引:(重点)
默认:_id

新建索引:
联合索引:db.student.ensureIndex({"age":-1,"score":-1},{name: "age_-1_index"});

查询索引:
db.student.getIndexes();

查询执行计划:
db.students.find("age":19).explain();
强制索引:(hint 设置的索引顺序和建立的索引顺序一样)
db.students.find({"$or":[
{"age":{"$gt":19}},
{"score":{"$gt":60}}]}).hint({"age":-1,"score":-1}).explain();

删除索引:
单个删除:
db.student.dropIndexes({"age":-1,"score":-1});
批量全部删除:(删除非_id的索引,即自定义的)
db.student.dropIndexes();


db.student.ensureIndex({"age":-1,"score":-1},{name: "age_-1_index"});

欢迎对it热情的同学,加qq进行技术讨论; QQ:850922253
原文地址:https://www.cnblogs.com/zhangwensi/p/6293534.html