第一步:下载mongodb安装包:
MongoDB官方下载地址:http://www.mongodb.org/downloads
第二步:解压压缩包
将安装包在/usr/local目录下解压缩:
tar -zxvf mongodb-linux-x86_64-rhel62-3.4.2.tgz
第三步:安装准备
将mongodb解压后的文件夹重命名:
[root@192 local]# mv mongodb-linux-x86_64-rhel62-3.4.2 mongodb
然后在/usr/local/mongodb创建数据目录 data和日志文件dblogs:
[root@192 mongodb]# mkdir -p data
[root@192 mongodb]# touch dblogs
第四步:加入开机启动
将mongodb启动项目加入/etc/rc.local,保证mongodb在服务器开机时启动。
#echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/dblogs --fork">>/etc/rc.local
第五步:测试启动和关闭mongodb
启动:
进入mongodb数据库:
[root@192 bin]# ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2020-10-07T00:36:09.311+0800 I STORAGE [initandlisten]
2020-10-07T00:36:09.311+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTi
ger storage engine
关闭:
[root@192 bin]# killall mongod
[root@192 bin]# pstree -p |grep mongod
[root@192 bin]# ps -ef |grep mongod
root 4071 3812 0 00:35 pts/1 00:00:00 grep mongod
查看进程列表:
pstree -p |grep mongod 可以看到主进程和子进程
关闭 pkill mongod 或kill all,不要用kill -9 PID (在老版本的mongodb会形成一个锁文件,会导致不能再启动,3.4中没有发现该问题)
查看mongodb端口号 netstat -tunlp|grep :27017(默认27017)
退出:exit 或 ctrl+c
简单的测试命令:
show dbs 查看有多少个数据库
db 查看当前数据库
查看当前数据库有多少个集合:show tables 或show collections
插入数据:
db.c1.insert({name:"zhoukou"});
WriteResult({ "nInserted" : 1 })
show dbs
admin 0.000GB
local 0.000GB
test 0.000GB
db
test
发现多了一个test数据库,当前数据库为test数据库
查看数据:
db.henan.find()
{ "_id" : ObjectId("5f7ca03732e269d0198e0770"), "name" : "zhouk
ou" }
发现henan集合里多了一个json对象,有两个字段,第一个是name,值为zhoukou;ObjectId是随机形成的,由计算机机器号+进程号和时间等编号、当前命名空间里的编号组成,所以即使将多个集合中的数据合并,也不会冲突。因为不同的集合里ObjectId是不会重复的。
常用的mongodb数据库命令:
不带任何符号的命令在 Linux的shell或者windows的cmd环境运行。
带有>符号的命令在MongoDB的客户端 mongo shell中运行。
mongodb数据库常用命令
1)查看命令提示
db.help();
2)切换/创建数据库
use mydb;如果数据库不存在,则创建数据库,否则切换到指定数据库。
db
mydb
3)查询所有数据库
show dbs;
4)删除当前使用数据库
db.dropDatabase();
5)从指定主机上克隆数据库
db.cloneDatabase("192.168.199.9");
6)从指定的机器上复制指定数据库数据到某个数据库
db.copyDatabase("mydb", "temp", "192.168.199.9");
7)修复当前数据库
db.repairDatabase();
8)查看当前使用的数据库
db.getName();
或者
db;
9)显示当前db状态
db.stats();
{
"db" : "test",
"collections" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"fileSize" : 0,
"ok" : 1
}
10)当前db版本
db.version();
11)查看当前db的链接机器地址
db.getMongo();
12)查询之前的错误信息
db.getPrevError();
13)清除错误记录
db.resetError();
集合相关命令:
1) 创建一个集合
db.createCollection("mycoll");
或者带参数创建固定集合
db.createCollection("log", {size: 20, capped:true, max: 100});
2) 显示当前数据库中的集合
show collections;
或者
db.getCollectionNames();
3) 使用集合
db.mycoll
或者
db.getCollection("mycoll")
4)查看集合命令帮助文档
db.mycoll.help();
5)查询当前集合的数据条数
db.mycoll.count();
6)查看集合数据大小
db.mycoll.dataSize();
7)查看集合索引大小
db.mycoll.totalIndexSize();
8)为集合分配的空间大小,包括未使用的空间
db.mycoll.storageSize();
9)显示集合总大小,包括索引和数据的大小和分配空间的大小
db.mycoll.totalSize();
10)显示当前集合所在的db
db.mycoll.getDB();
11)显示当前集合的状态
db.mycoll.stats();
12)集合的分片版本信息
db.mycoll.getShardVersion();
13)集合重命名
db.mycoll.renameCollection("users");
或者
db.getCollection("mycoll").renameCollection("users");
将mycoll重命名为users,集合名为纯数字时只能使用db.getCollection("mycoll").renameCollection这种方式。
14) 显示当前db所有集合的状态信息
db.printCollectionStats();
15)删除当前集合
db.mycoll.drop();
文档相关命令:
1)写入文档
db.user.insert({"name":"joe"});
或者
db.user.save({"name":"joe"});
2)查看文档
db.user.find();
3)更新文档
db.user.save({"_id" : ObjectId("579036a9de4344710224234d"), "myName" : "joe", "age" : 20})
update()使用示例:
db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,{multi:true},WriteConcern.SAFE);
db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,true,WriteConcern.SAFE);
db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,WriteConcern.SAFE);
db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},{multi:1});
4)删除文档
使用示例:
db.user.remove({"myName" : "joe"},1);
db.user.remove({"myName" : "joe"});
5)更新文档并返回文档
db.user.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2‘}, $inc: {age: 2}}
});
或者
db.runCommand({ findandmodify : "user",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2‘}, $inc: {age: 2}}
});
6) 删除文档并返回文档
db.user.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
remove: true
});
或者
db.runCommand({ findandmodify : "user",
query: {age: {$gte: 25}},
sort: {age: -1},
remove: true
});
7)查询满足条件的文档数量
db.user.count({$or: [{age: 14}, {age: 28}]});
索引相关命令:
1) 创建索引
db.user.ensureIndex({age: 1});
db.user.ensureIndex({myName: 1, age: -1});
例如我们有数据:
{"myName":"joe",age:14}
{"myName":"ad",age:14}
{"myName":"ad",age:38}
{"myName":"ad",age:24}
{"myName":"ab",age:14}
使用db.user.ensureIndex({myName: 1, age: -1})建议索引后,索引中的数据组织为:
{"myName":"ab",age:14}
{"myName":"ad",age:38}
{"myName":"ad",age:24}
{"myName":"ad",age:14}
{"myName":"joe",age:14}
创建索引还可以搭配一些参数:
db.test.ensureIndex({"username":1},{"background":true})
db.test.ensureIndex({"userid":1},{"unique":true})
db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
db.test.ensureIndex({"userid":1},{"unique":true,"sparse":true})
2) 查询集合所有索引
db.user.getIndexes();
3) 查看集合总索引记录大小
db.user.totalIndexSize();
4) 读取当前集合的所有index信息
db.user.reIndex();
5) 删除指定索引
db.user.dropIndex("myName");
6) 删除集合所有索引
db.user.dropIndexes();
基本查询命令
find简介
db.user.find();
如果需要结构化显示返回的文档可以加上pretty()方法,如下:
db.user.find().pretty();
括号中可以设置两个个参数,以逗号分隔识别
db.user.find({"myName":"joe"},{"age":1})
游标
游标一般用于遍历数据集。通过hasNext()判断是否有下一条数据,next()获取下一条数据。
例如:
var cursor= db.user.find();
while(cursor.hasNext()){
var temp=cursor.next()
print(temp.myName);
}
游标还实现了迭代器接口,所以可以使用forEach。
var cursor= db.user.find();
cursor.forEach(function(temp){
print(temp.myName);
});
条件查询:
与操作
db.user.find({"myName":"joe","age":16})
或操作$or
db.user.find({$or: [{age: 14}, {age: 28}]});
大于$gt
db.user.find({age: {$gt: 20}})
小于$lt
db.user.find({age: {$lt: 20}})
大于等于$gte
db.user.find({age: {$gte: 20}})
小于等于$lte
db.user.find({age: {$lte: 20}})
类型查询$type
使用方式如下:
db.user.find( { "myName" : { $type : 2 } } );
db.user.find( { "myName" : { $type : "string" } } );
是否存在$exists
db.user.find({"age": {$exists: true}})
取模$mod
db.user.find({"age": {$mod : [10, 0]}});
不等于$ne
db.user.find({ "age" : { "$ne" : 23}})
包含$in
db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})
不包含$nin
db.user.find({ "myName" : { "$nin" : [ "joe" , "ab"]}})
$not: 反匹配
以上所有字段查询操作都能取非,比如:
db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})
db.user.find({ "myName" : {$not:{ "$in" : [ "joe" , "ab"]}}})
特定类型查询
1 null
db.user.find({"company":null})
查询company字段为null的文档。
db.user.find({"company":{$nin:[null]} })
查询company字段不为空的文档。
db.user.find({"name":/^j/})
3 嵌套文档
BSON格式的文档是可以相互嵌套的,例如如下文档phone字段的值就是一个子文档:
{
"name" : "huangz",
"phone" : { "home" : 123321,
"mobile" : 15820123123}
}
3.1 精确匹配查询
指定完整的文档,查询出子文档完全匹配指定文档的文档。
db.user.find({"phone":{"home" : 123321,"mobile" : 15820123123}})
3.2 点查询
如果我们不知道子文档的完整文档,只知道子文档中一个字段的值,可以通过点查询。
db.user.find({"phone.home":123321})
4数组
4.1 数组单元素查询
db.user.find({favorite_number:6});
4.2 $all数组多元素查询
db.user.find({favorite_number : {$all : [6, 8]}});
4.3 $size数组长度查询
db.user.find({favorite_number: {$size: 3}});
4.4 $slice返回数组子集
db.user.find({},{favorite_number: {$slice: 2}});
db.user.find({},{favorite_number: {$slice: -2}});
4.5 精确匹配查询
db.user.find({favorite_number :[6, 8]});
4.6点查询
点查询用于查询更复杂的数组,例如数组中包含的是子文档的情况:
{
"name" : "joe",
"phone" :[ { "home" : 123321,
"mobile" : 1854046352},
{ "home" : 123652,
"mobile" : 15820123123} ,
{ "home" : 123456,
"mobile" : 13820123123}
]
}
需要查询phone数组中子文档的home值为123456的文档,使用命令:
db.user.find({"phone.home":123456});
4.7索引查询
数组都有索引,例如[6,8],6是第0个元素,8是第1个元素(数组索引以0开头)。要查找某个元素指定值的文档可以使用点和索引值:
db.user.find({"favorite_number.0":6});
点查询中只要数组的子文档里有一个home值满足查询值就会返回文档。如果我们要精确到第几个元素也可以用索引查询。
db.user.find({"phone.2.home":123456});
4.8 元素查询$elemMatch
数组的子文档如果有多个字段,查询出子文档同时满足两个条件的文档有两种方式:
db.user.find({"phone.home":123456,"phone.mobile":13820123123});
或者
db.user.find( {
phone: {
$elemMatch: {
home :123456,
mobile: 13820123123
}
}
} )
高级查询$where
Javascript编程简单例子
db.user.find().forEach(function(item){
if(item.age>18){
item.tag="adult";
}
db.user.save(item);
})
Javascript与$where结合使用
db.user.find({age: {$gt: 18}});
或者
db.user.find({$where: "this.age > 18"});
或者
db.user.find("this.age > 18");
或者
f = function() {return this.age > 18}; db.user.find(f);
查询辅助
1 条数限制limit
db.user.find().limit(2);
2 起始位置skip
db.user.find().skip(3).limit(5);
3 排序sort
db.user.find().sort({age: 1});
db.user.find().sort({age: -1});
原文:https://blog.51cto.com/9285090/2540230