在 /data 路径下创建文件夹 db_test 来存放 MongoDB 服务的数据。(数据存放位置)
cd /data #进入data路径
mkdir db_test #创建db文件夹
在 /logs 路径下创建文件夹 mongo 存放日志文件 mongod.log(文件不用创建,到时候会自动生成,但路径即文件夹必须提前创建好)。(日志文件)
mkdir /logs #创建/logs路径
cd /logs #进入log路径
mkdir mongo #创建mongo文件夹
在 /etc/mongod(没有路径就创建)路径下新建配置文件 mongod.conf,使用配置文件启动 MongoDB 服务(把命令写入配置文件,以后启动服务就不用再输入一长串的命令,直接启动配置文件即可)。
mongo --port 27017(端口号)
exit
能连接到客户端时:
use admin #使用系统数据库admin,只有在admin数据库中才可以进行关闭服务的操作
db.shutdownServer() #关闭服务
客户端无法连接时:
查看 Mongo 相关进程 ps -ef | grep mongo
kill 和 Mongo 的服务进程 kill进程号码
MongoDB安装完成后,可以通过pgrep mongo -l命令来查看是否已经启动。
在操作数据库之前,需要连接它,连接本地数据库服务器,输入命令:mongo
创建数据库命令:use Testdb
(如果数据库不存在,则创建数据库,否则切换到指定数据库)
查看所有数据库我们可以用命令:show dbs
然而并没有我们刚创建的Testdb
数据库。要想显示它,我们需要向数据库插入一些数据:db.Testdb.insert({_id:1,name:"王小明"})
:
MongoDB删除数据库需要先切换到该数据库中:use Testdb
然后执行删除命令:db.dropDatabase()
MongoDB数据库中的集合相当于MySQL数据库中的表。
Testdb
: use Testdb
db.mytest2.insert([{"name" : "王小明","sex":"男"},{"name" : "李小红","sex":"女"}])
:db.集合名.insert(文档)。
document=({_id:1,
name: '魏建新',
sex: '男',
hobbies: ['乒乓球','羽毛球'],
birthday: '2002-09-12'
});
db.person.insert(document)
//person是集合名,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档
主要用到了:update()和save()方法。
用update()方法来更新person的数据,把王小明的出生日期替换成1996,命令如下:
db.person.update({birthday:"1996-02-14"},{$set:{birthday:"1996"}})
save()方法通过传入的文档来替换已有文档。
db.person.save({
"_id" :1,
"name" : "李小红",
"sex" : "女",
"hobbies" : [
"画画",
"唱歌",
"跳舞"
],
"birthday" : "1996-06-14"
})
或:db.person.save(newdocument)
pretty()
方法,使输出更整齐
条件查询
操作 | 格式 | 范例 | 关系数据库中类似的语句 |
---|---|---|---|
等于 | { |
db.stu1.find({“name”:“李小红”}).pretty() | where name = ‘李小红’ |
小于 | { |
db.stu1.find({“age”:{$lt:18}}).pretty() | where age < 18 |
小于或等于 | { |
db.stu1.find({“age”:{$lte:18}}).pretty() | where age <= 18 |
大于 | { |
db.stu1.find({“age”:{$gt:18}}).pretty() | where age > 18 |
大于或等于 | { |
db.stu1.find({“age”:{$gte:18}}).pretty() | where age >= 18 |
不等于 | { |
db.stu1.find({“age”:{$ne:18}}).pretty() | where age != 18 |
find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件。如查询集合stu1中年龄为20岁的男性信息:
db.stu1.find({"age":20, "sex":"男"}).pretty()
删除指定的数据:db.stu1.remove({'age':20}) //删除年龄为20的数据
删除全部数据(集合并不会删除):db.stu1.remove({})
数据导入工具:mongoimport;
mongoimport -d Testdb1 -c score --type csv --headerline --ignoreBlanks --file test.csv
数据导出工具: mongoexport;
#导出 json 格式文件:
mongoexport -d Testdb1 -c score -o /file.json --type json
#导出 csv 格式的文件:
mongoexport -d Testdb1 -c score -o /file.json --type csv -f "_id,name,age,sex,major"
_id | name | sex | hobbies |
---|---|---|---|
1 | 小红 | 女 | 唱歌,跳舞,羽毛球 |
2 | 小明 | 男 | 唱歌,乒乓球,羽毛球 |
3 | 小亮 | 男 | 乒乓球,羽毛球 |
#查询其中所有喜欢“唱歌”和“羽毛球”的人:
db.hobbies.find({hobbies:{$all:["唱歌","羽毛球"]})
#查询 hobbies 集合中存在 age 字段的文档:
db.hobbies.find({age:{$exists:true}})
#hobbies 集合中不存在 age 字段的文档:
db.hobbies.find({age:{$exists:false}})
#查询 age 取模7等于4的文档:
db.hobbies.find({age:{$mod:[7,4]}})
#查询 age =17或 age =20的文档 :
db.hobbies.find({age:{$in:[17,20]}})
#查询 age !=17且 age !=20的文档:
db.hobbies.find({age:{$nin:[17,20]}})
#可以查询特定长度的数组,比如 hobbies 这一字段,查询有两个爱好的文档:
db.hobbies.find({hobbies:{$size:2}})
db.collection.find().sort({_id:1}) #将查询结果按照_id升序排序
db.collection.find().sort({_id:-1}) #将查询结果按照_id降序排序
_id | name | age | sex | major |
---|---|---|---|---|
1 | 王晓丽 | 19 | 女 | 计算机 |
2 | 张明 | 21 | 男 | 计算机 |
3 | 秋雅 | 20 | 女 | 播音主持 |
4 | 张欣欣 | 18 | 女 | 表演 |
#$or 表示多个查询条件之间是或的关系,比如查询性别 sex 为 男 或年龄 age 为18的文档信息:
db.student.find({$or:[{sex:"男"},{age:18}]})
#$and表示多个查询条件之间是且的关系,比如查询年龄 age 大于18且小于21(18 < age < 21)的信息:
db.student.find({$and:[{age:{$gt:18}},{age:{$lt:21}}]})
#$not 用来执行取反操作,比如查询年龄 age 大于等于20岁,然后进行取反(即查询年龄小于20岁的文档):
db.student.find({age:{$not:{$gte:20}}})
#查询不符合major=计*开头文档:
db.student.find({major:{$not:/^计.*/}})
#比如返回上一步正则查询到的结果集有几条:
db.student.find({major:{$not:/^计.*/}}).count()
通俗的说,游标不是查询结果,而是查询的返回资源,或者接口。通过这个接口,你可以逐条读取。就像 fopen 打开文件,得到一个资源一样,通过资源,可以一行一行的读文件。
#我们首先插入10000条数据到集合 items,因为 mongodb 底层是 javascript 引擎,所以我们可以使用 js 的语法来插入数据:
for(var i=0;i<10000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})
#定义一个变量来保存这个游标,find 的查询结果(_id<=5)赋值给了游标 cursor 变量,代码如下:
var cursor=db.items.find({_id:{$lte:5}})
我们可以在分页的情况下使用游标。
假设每页有10行,我们查询第701页,可以配合 skip() 和 limit() 来实现,具体步骤如图所示:
如果不想全部取出,只取出某一个,可以使用如下方法,取出数组下标,具体步骤如图所示: