一款强大、灵活、且易于扩展的通用型数据库。
SQL术语/概念 | MongoDB术语/概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录/集合 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
# mysql
+----+-----------+--------------+
| id | name | email |
+----+-----------+--------------+
| 1 | 林海峰 | 1234@163.com |
| 2 | 武沛齐 | 1234@163.com |
+----+-----------+--------------+
# mongodb
{
"_id" : ObjectId("5a61eca60793da2b97ba6900"),
"name" : "林海峰",
"eamil" : "[email protected]"
}
{
"_id" : ObjectId("5a61ecab0793da2b97ba6901"),
"name" : "武沛齐",
"eamil" : "[email protected]"
}
新建目录与文件
D:\MongoDB\data\db
D:\MongoDB\log\mongod.log
新建配置文件mongod.cfg,参考:https://docs.mongodb.com/manual/reference/configuration-options/
systemLog:
destination: file
path: "D:\MongoDB\log\mongod.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "D:\MongoDB\data\db"
net:
bindIp: 0.0.0.0
port: 27017
setParameter:
enableLocalhostAuthBypass: false
制作系统服务
mongod --config "D:\MongoDB\mongod.cfg" --bind_ip 0.0.0.0 --install
或者直接在命令行指定配置
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
启动\关闭
net start MongoDB
net stop MongoDB
登录
mongo
mongodb环境下,创建账号
use admin
db.createUser(
{
user: "root",
pwd: "123",
roles: [ { role: "root", db: "admin" } ]
}
)
use test
db.createUser(
{
user: "egon",
pwd: "123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "db1" } ]
}
)
重启数据库
mongod --remove
mongod --config "C:\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install --auth
登录:注意使用双引号而非单引号
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"
mongo
use admin
db.auth("root","123")
其他
MongoDB在保留了JSON基本键/值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下,这些类型的确切表示有些许差异。
ObjectId采用12字节的存储空间,是一个由24个十六进制数字组成的字符串
0|1|2|3| | 4|5|6| | 7|8 | 9|10|11 |
时间戳 | 机器 | PID | 计数器 |
> use database1
switched to db database1
> db.table1.insert({'a':1})
WriteResult({ "nInserted" : 1 })
> db.table2.insert({'b':2})
WriteResult({ "nInserted" : 1 })
查
> show tables
table1
table2
删
> db.table1.drop()
true
> show tables
table2
插入单条
user0={
"name":"egon",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'BJ'
}
}
db.test.insert(user0)
db.test.find()
插入多条
user1={
"_id":1,
"name":"alex",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'weifang'
}
}
user2={
"_id":2,
"name":"wupeiqi",
"age":20,
'hobbies':['music','read','run'],
'addr':{
'country':'China',
'city':'hebei'
}
}
user3={
"_id":3,
"name":"yuanhao",
"age":30,
'hobbies':['music','drink'],
'addr':{
'country':'China',
'city':'heibei'
}
}
user4={
"_id":4,
"name":"jingliyang",
"age":40,
'hobbies':['music','read','dancing','tea'],
'addr':{
'country':'China',
'city':'BJ'
}
}
user5={
"_id":5,
"name":"jinxin",
"age":50,
'hobbies':['music','read',],
'addr':{
'country':'China',
'city':'henan'
}
}
db.user.insertMany([user1,user2,user3,user4,user5])
删除多个中的第一个
db.user.deleteOne({ 'age': 8 })
删除国家为China的全部
db.user.deleteMany( {'addr.country': 'China'} )
删除全部
db.user.deleteMany({})
语法:db.table,update(条件,修改字段,其他参数)
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
覆盖式修改,会把更新数据直接替换掉原来的数据
# 方式一
db.user.update({"name": "alex"}, {"age":11}, {"mmulti":true,"upsert":true})
# 方式二
var obj=db.user.findOne({"_id":2})
obj.username=obj.name+'SB'
obj.hobbies_count++
delete obj.age
db.user.update({"_id":2},obj)
#1、update db1.user set name="WXX" where id = 2
db.user.update({'_id':2},{"$set":{"name":"WXX",}})
#2、没有匹配成功则新增一条{"upsert":true}
db.user.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true})
#3、默认只改匹配成功的第一条,{"multi":改多条}
db.user.update({'_id':{"$gt":4}},{"$set":{"age":28}})
db.user.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true})
#4、修改内嵌文档,把名字为alex的人所在的地址国家改成Japan
db.user.update({'name':"alex"},{"$set":{"addr.country":"Japan"}})
#5、把名字为alex的人的地2个爱好改成piao
db.user.update({'name':"alex"},{"$set":{"hobbies.1":"piao"}})
#6、删除alex的爱好,$unset
db.user.update({'name':"alex"},{"$unset":{"hobbies":""}})
$inc 增加和减少
#1、所有人年龄增加一岁
db.user.update(
{},
{
"$inc": {"age": 1}
},
{
"multi": true
}
)
#2、所有人年龄减少5岁
db.user.update(
{},
{
"$inc":{"age":-5}
},
{
"multi":true
}
)
$push,往数组添加元素
# 为名字为yuanhao的人添加一个爱好read
db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}})
# 为名字为yuanhao的人一次添加多个爱好tea,dancing
db.user.update({"name":"yuanhao"},{"$push":{
"hobbies":{"$each":["tea","dancing"]}
}})
$pop,从开头或结尾删除元素
# {"$pop":{"key":1}} 从数组末尾删除一个元素
db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":1}
})
# {"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":-1}
})
“$pull”,按照条件统统删掉
db.user.update({'addr.country':"China"},{"$pull":{
"hobbies":"read"}
},
{
"multi":true
}
)
$addToSet,避免重复添加
db.urls.insert({"_id":1,"urls":[]})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
db.urls.update({"_id":1},{
"$addToSet":{
"urls":{
"$each":[
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.xxxx.com'
]
}
}
}
)
比较运算:”$ne”,”$gt”,”$lt”,”gte”,”lte”
#1、select * from db1.user where name = "alex";
db.user.find({'name':'alex'})
#2、select * from db1.user where name != "alex";
db.user.find({'name':{"$ne":'alex'}})
#3、select * from db1.user where id > 2;
db.user.find({'_id':{'$gt':2}})
#4、select * from db1.user where id < 3;
db.user.find({'_id':{'$lt':3}})
#5、select * from db1.user where id >= 2;
db.user.find({"_id":{"$gte":2,}})
#6、select * from db1.user where id <= 2;
db.user.find({"_id":{"$lte":2}})
逻辑运算:字典中逗号分隔的多个条件是and关系,”$or”的条件放到[]内,”$not”
#1、select * from db1.user where id >= 2 and id < 4;
db.user.find({'_id':{"$gte":2,"$lt":4}})
#2、select * from db1.user where id >= 2 and age < 40;
db.user.find({"_id":{"$gte":2},"age":{"$lt":40}})
#3、select * from db1.user where id >= 5 or name = "alex";
db.user.find({
"$or":[
{'_id':{"$gte":5}},
{"name":"alex"}
]
})
#4、select * from db1.user where id % 2=1;
db.user.find({'_id':{"$mod":[2,1]}})
#5、上题,取反
db.user.find({'_id':{"$not":{"$mod":[2,1]}}})
成员运算,”$in”,”$nin”
#1、select * from db1.user where age in (20,30,31);
db.user.find({"age":{"$in":[20,30,31]}})
#2、select * from db1.user where name not in ('alex','yuanhao');
db.user.find({"name":{"$nin":['alex','yuanhao']}})
正则匹配
# select * from db1.user where name regexp '^j.*?(g|n)$';
db.user.find({'name':/^j.*?(g|n)$/i})
取指定的字段
# select name,age from db1.user where id=3;
db.user.find({'_id':3},{'_id':0,'name':1,'age':1})
查询数组
#1、查看有dancing爱好的人
db.user.find({'hobbies':'dancing'})
#2、查看既有dancing爱好又有tea爱好的人
db.user.find({
'hobbies':{
"$all":['dancing','tea']
}
})
#3、查看第4个爱好为tea的人
db.user.find({"hobbies.3":'tea'})
#4、查看所有人最后两个爱好
db.user.find({},{'hobbies':{"$slice":-2},"age":0,"_id":0,"name":0,"addr":0})
#5、查看所有人的第2个到第3个爱好
db.user.find({},{'hobbies':{"$slice":[1,2]},"age":0,"_id":0,"name":0,"addr":0})
> db.blog.find().pretty()
{
"_id" : 1,
"name" : "alex意外死亡的真相",
"comments" : [
{
"name" : "egon",
"content" : "alex是谁???",
"thumb" : 200
},
{
"name" : "wxx",
"content" : "我去,真的假的",
"thumb" : 300
},
{
"name" : "yxx",
"content" : "吃喝嫖赌抽,欠下两个亿",
"thumb" : 40
},
{
"name" : "egon",
"content" : "xxx",
"thumb" : 0
}
]
}
db.blog.find({},{'comments':{"$slice":-2}}).pretty() #查询最后两个
db.blog.find({},{'comments':{"$slice":[1,2]}}).pretty() #查询1到2
排序
# 排序:--1代表升序,-1代表降序
db.user.find().sort({"name":1,})
db.user.find().sort({"age":-1,'_id':1})
分页
# 分页:--limit代表取多少个document,skip代表跳过前多少个document。
db.user.find().sort({'age':1}).limit(1).skip(2)
获取数量
# 获取数量
db.user.count({'age':{"$gt":30}})
--或者
db.user.find({'age':{"$gt":30}}).count()
其他
#1、{'key':null} 匹配key的值为null或者没有这个key
db.t2.insert({'a':10,'b':111})
db.t2.insert({'a':20})
db.t2.insert({'b':null})
> db.t2.find({"b":null})
{ "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 }
{ "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null }
#2、查找所有
db.user.find() #等同于db.user.find({})
db.user.find().pretty()
#3、查找一个,与find用法一致,只是只取匹配成功的第一个
db.user.findOne({"_id":{"$gt":3}})