MongoDB

Posted 丶默箫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。

安装MongoDB和账号管理

1、安装路径为
D:\\MongoDB,将D:\\MongoDB\\bin目录加入环境变量

2、新建目录与文件

D:\\MongoDB\\data\\db
D:\\MongoDB\\log\\mongod.log

3、制作系统服务

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

4、启动系统服务/关闭系统服务

net start MongoDB  /  net stop MongoDB 

5、进入MongoDB

当进入MongoDB有一些警告信息,需要去掉

首先关闭服务,再进行重启数据库

mongod --remove

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 --auth

在MongoDB外登录账号

mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"

6、创建账号,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" },  #操作test库有读写权限

             { role: "read", db: "db1" } ]    #操作其他库只有读的权限

  }

)

 
代码

二、操作

1、数据库操作

#1、增
use config #如果数据库不存在,则创建数据库,否则切换到指定数据库。
 
#2、查
show dbs #查看所有
可以看到,我们刚创建的数据库config并不在数据库的列表中, 要显示它,我们需要向config数据库插入一些数据。
db.user.insert({\'a\':1})

#3、删
use config #先切换到要删的库下
db.dropDatabase() #删除当前库

2、集合操作:

#1、增
  #mongoDB 中得表没有父子的关系
  db.user
  db.user.info
  db.user.auth
      # 创建一个id是1,名字是egon的数据,id必须写_id
  db.user.insert({"_id":1,"name":""egon"})
#2、查
> show dbs #只要不为空就能显示出来
> show tables
> show collextions  #与tables一样功能
table1
table2
#3、删

> db.table1.drop()
true
> show tables
table2

 3、文档操作

添加数据进入表

db.user.insert({"_id":1,"name":"egon"})

《a、增加》

#1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变

#2、插入单条
user0={
    "name":"egon",
    "age":10,
    \'hobbies\':[\'music\',\'read\',\'dancing\'],
    \'addr\':{
        \'country\':\'China\',
        \'city\':\'BJ\'
    }
}
#把user0的数据添加进去
db.user.insert(user0)
#查看表里的所有数据
db.user.find()

#3、插入多条
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])
单条插入与多条插入
# 基于save添加
    db.t1.insert({"_id":1,"a":1,"b":2,"c":3}) #有相同的_id则覆盖,无相同的_id则新增,必须指定_id db.t1.save({"_id":1,"z":6}) db.t1.save({"_id":2,"z":6}) db.t1.save({"z":6})

《b、查询

#SQL与MongoDB查询分别:
# SQL:=,!=,>,<,>=,<=
# MongoDB:{key:value}代表什么等于什么,"$ne","$gt","$lt","gte","lte",其中"$ne"能用于所有数据类型

#1、名字等于alex
SQL:select * from db1.user where name = "alex";
MongoDB:db.user.find({\'name\':\'alex\'})

#2、名字不等于alex
SQL:select * from db1.user where name != "alex";
MongoDB:db.user.find({\'name\':{"$ne":\'alex\'}})

#3、id大于2
SQL:select * from db1.user where id > 2;
MongoDB:db.user.find({\'_id\':{\'$gt\':2}})

#4、id小于3
SQL:select * from db1.user where id < 3;
MongoDB:db.user.find({\'_id\':{\'$lt\':3}})

#5、id大于等于2
SQL:select * from db1.user where id >= 2;
MongoDB:db.user.find({"_id":{"$gte":2,}})

#6、id小于等于2
SQL:select * from db1.user where id <= 2;
MongoDB:db.user.find({"_id":{"$lte":2}})
比较运算

SQL语句中:and、or、not   

MongoDB中:筛选只能是字典套条件{{},[]}  逗号“,”是和的意思,

或者:“$or”后面条件放入[]中,“$or”:[]              否则:用“$not”表示

# SQL:and,or,not
# MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到[]内,"$not"

#1、取出id大于等于2和小于4的数据
SQL:select * from db1.user where id >= 2 and id < 4;
MongoDB:db.user.find({\'_id\':{"$gte":2,"$lt":4}})

#2、取出id大于等于2和年龄小于40的数据
SQL:select * from db1.user where id >= 2 and age < 40;
MongoDB:db.user.find({"_id":{"$gte":2},"age":{"$lt":40}})

#3、取出id大于等于5或者name等于alex的数据
SQL:select * from db1.user where id >= 5 or name = "alex";
MongoDB:db.user.find({
    "$or":[
        {\'_id\':{"$gte":5}},
        {"name":"alex"}
        ]
})
#取出id(大于等于0和小于等于1)或id大于等于4或name等于yuanhao的数据
SQL:select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao";
MongoDB:db.user.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"yuanhao"}
]})
#4、取出除以2于1的id
SQL:select * from db1.user where id % 2=1;
MongoDB:db.user.find({\'_id\':{"$mod":[2,1]}})

#5、上题,取反
db.user.find({\'_id\':{"$not":{"$mod":[2,1]}}})

逻辑运算
逻辑运算

成员运算:$in,$nin

#查询name中alex和egon是否在数据中
db.user.find({"name":{"$in":["alex","egon"]}})
db.user.find({"name":{"$nin":["alex","egon"]}})

正则匹配

#查询以jin开头和以g或n结尾的数据,i是区分大小写的
select * from db1.user where name regexp "^jin.*?(g|n)$";
db.user.find({
    "name":/^jin.*?(g|n)$/i
})

查指定字段

#0是不显示其字段,1就是显示其字段
select name,age from db1.user where name regexp "^jin.*?(g|n)$";
db.user.find({
    "name":/^jin.*?(g|n)$/i
},
{
    "_id":0,
    "name":1,
    "age":1
}
)

查询数组

#1、查看有dancing爱好的人
db.user.find({\'hobbies\':\'dancing\'})

#2、查看既有dancing爱好又有tea爱好的人
db.user.find({\'hobbies\':{"$all":[\'dancing\',\'tea\']}})

#3、查看第2个爱好dancing的人
db.user.find({"hobbies.2":"dancing"})

#4、查看数据中以索引[1,2]切片显示爱好,并且只显示爱好字段
db.user.find(
{},
{
    "_id":0,
    "name":0,
    "age":0,
    "addr":0,
    "hobbies":{"$slice":[1,2]},
}
)
按照条件查询(数组)

排序

# 排序:--1代表升序,-1代表降序
db.user.find().sort({"name":1,})
db.user.find().sort({"age":-1,\'_id\':1})

获取数量

# 获取数量
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}})
杂项

《c、修改》

#update() 方法用于更新已存在的文档。语法格式如下:
db.user.update(
    条件,
    修改字段,
    {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
    )
参考SQL:update db1.t1 set id=10 where name="egon";
upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。
multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。
writeConcern :可选,抛出异常的级别。
更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。
update语法
#查找name等于egon,把age修改为11,如果没有upsert为true就会添加一条只有age=11的数据
db.user.update(
    {"name":"egon"},
    {"age":11},
    {
        "multi":true,
        "upsert":true
    }
    )
update列子
#覆盖式:就是按照条件查找数据,修改的数据把原来的数据覆盖掉(慎用)
db.user.update(
        {"name":"alex"},
        {"age":10,"name":"Alex**"}
    )
覆盖式
    #局部修改:$set  只修改更新字段(很受用)如果没有age字段,同样会自动添加
db.user.update(
        {"name":"alex"},
        {"$set":{"age":73,"name":"潘金莲-alex"}}
    )
局部修改
#改多条 就是把查询知识运用进来,请看查询
db.user.update(
        {"_id":{"$gte":1,"$lte":2}},
        {"$set":{"age":53,}},
        {"multi":true}
    )
多条修改
#修改嵌套文档  大概意思就是字典中如果还有字典,就可以用“.”进行内部修改(不懂自己实验)
#{ "_id" : 3, "name" : "潘金莲-alex", "age" : 30, "hobbies" : [ "music", "drink" ], "addr" : { "country" : "China", "city" :
"heibei" } }
db.user.update(
        {"name":"潘金莲-alex"},
        {"$set":{"addr.country":"Japan"}}
字典嵌套(.一下就懂)
#修改数组  也就是按照索引修改(MMP脑袋炸了,一看到数字就蒙蔽)
    db.user.update(
        {"name":"潘金莲-alexios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS