标签 数据库 下的文章

MondoDB 学习

介绍

最近正在学习爬虫,涉及到MongoDB,学习一下。

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 连接

shell连接方式(Linux)

mongodb://admin:123456@localhost/test

window 下bin目录添加到环境变量,直接cmd下mongo 即可运行MongoDB

mongo admin -u 用户名 -p 密码 --port 端口号 --host 127.0.0.1

<! -- more -->

设置账号

MongoDB数据库在默认是没有用户名及密码,不用安全验证的,只要连接上服务就可以进行CRUD操作。

创建用户

mongo 命令先进入Mongo命令行,输入以下命令:

db.createUser(
 {
  "user":"admin",
  "pwd":"admin",
  roles:[{role:"userAdminAnyDatabase",db:"admin"}]
 }
)
用户权限看下面

开启登陆验证

如果需要给MongoDB数据库使用安全验证,则需要用--auth开启安全性检查,则只有数据库认证的用户才能执行读写操作。

进入系统注册表,找到[HKEY_LOCAL_MACHINE-->SYSTEM-->CurrentControlSet-->Services-->MongoDB]在右边的健-值列表中找到 “ImagePath”

在ImagePath对应的值中添加--auth,即

"D:\Program Files\MongoDB\Server\3.2\bin\mongod.exe" --dbpath=e:\db "--logpath=D:\Program Files\MongoDB\Server\3.2\logs\mongodb.log" --auth --service

重启MongoDB服务

重启之后,非验证方式还是能够登陆但是查询数据会提示权限问题查不到。
然后使用下面方式登陆,返回1 说明成功登陆:

C:\WINDOWS\system32>mongo admin
MongoDB shell version v4.0.1-7-g82de714df6
connecting to: mongodb://127.0.0.1:27017/admin
MongoDB server version: 4.0.1-7-g82de714df6
> db.auth("admin","admin")
1

创建普通用户

> use test
> db.createUser(
  {
    user: "test1",
    pwd: "test1",
    roles: [ { role: "readWrite", db: "test" } ]
  }
)

添加超级用户

use admin
db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "root", db: "admin" } ]
  }
);

MongoDB数据库角色

内建的角色 
数据库用户角色:read、readWrite; 
数据库管理角色:dbAdmin、dbOwner、userAdmin; 
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 
备份恢复角色:backup、restore; 
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 
超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 
内部角色:__system 
角色说明: 
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库 
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile 
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 
root:只在admin数据库中可用。超级账号,超级权限

基本操作

创建&查看数据库

use DATABASE_NAME    如果数据库不存在,则创建数据库,否则切换到指定数据库。
show dbs  查看所有数据库
db   显示当前所在数据库
db.DATABASE_NAME.insert({"name":"archerx"})   插入数据,刚创建的数据库插入数据才能显示
db.dropDatabase()   删除当前选中的数据库

删除集合(table)

> show tables
site
> db.site.drop()
true
db.createCollection(name, options)   创建集合
show collections   查看已经有的集合

插入keyvalue自动创建集合

> db.test.insert({"name":"archerx"})
WriteResult({ "nInserted" : 1 })
> show collections
test

删除集合: db.collection.drop()

查看集合: show collections

集合中插入数据:

db.col.insert({title: 'info', 
    description: 'desc',
    by: 'archerx',
    url: 'None',
    tags: ['mongodb', 'Redis', 'MySQL'],
    likes: 100
})

查询集合中数据

> db.col.find()
{ "_id" : ObjectId("5b7e265c850cd5e268ef5333"), "title" : "info", "description" : "desc", "by" : "archerx", "url" : "None", "tags" : [ "mongodb", "Redis", "MySQL" ], "likes" : 100 }
> db.col.find().pretty()
{
        "_id" : ObjectId("5b7e265c850cd5e268ef5333"),
        "title" : "info",
        "description" : "desc",
        "by" : "archerx",
        "url" : "None",
        "tags" : [
                "mongodb",
                "Redis",
                "MySQL"
        ],
        "likes" : 100
}

条件查询:

>db.col.find({key1:value1, key2:value2}).pretty()   #and条件
>db.col.find(           
   {
      $or: [
         {key1: value1}, {key2:value2}               #or条件
      ]
   }
).pretty()

更新数据:

> db.col.update({'title':'info'},{$set:{'title':'haha'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find().pretty()  #格式化输出查询结果
{
        "_id" : ObjectId("5b7e265c850cd5e268ef5333"),
        "title" : "haha",
        "description" : "desc",
        "by" : "archerx",
        "url" : "None",
        "tags" : [
                "mongodb",
                "Redis",
                "MySQL"
        ],
        "likes" : 100
}

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

删除数据:

>db.col.remove({'title':'MongoDB'})
WriteResult({ "nRemoved" : 2 })           # 删除了两条数据
>db.col.find()
……                                        # 没有数据

如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

更详细见:http://www.runoob.com/mongodb/mongodb-indexing.html

preView