51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1519|回复: 0
打印 上一主题 下一主题

mongodb的用户登录认证和基本使用

[复制链接]
  • TA的每日心情
    擦汗
    2022-8-30 09:02
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-2-25 16:02:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    连接:
    killall mongo
    mongo --host 127.0.0.1:27017
    创建超级管理员
    >use admin
    >db.createUser({
    user:"wjb",
    pwd:"wjb123456",
    roles:[
    {
    role:"userAdminAnyDatabase",
    db:"admin"
    }
    ]
    })
    Successfully added user: {
            "user" : "user",
            "roles" : [
                    {
                            "role" : "dbOwner",
                            "db" : "mydb"
                    }
            ]
    }
    >
    如果 MongoDB 开启了权限模式,并且某一个数据库没有任何用户时,在不验证权限的情况下,可以创建一个用户,当继续创建第二个用户时,会返回错误,若想继续创建用户则必须登录,并且要先进入admin数据库。

    PS:roles角色官网中分为built-in roles and user-defined roles
    Built-In Roles(内置角色):
    1. 数据库用户角色:read、readWrite;
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    4. 备份恢复角色:backup、restore;
    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root  
    // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
    7. 内部角色:__system

    创建用户时可以在其数据库中创建,这样不用每次都进入admin数据库登录后再切换。如在数据库"mydb"创建用户"newwjb"。
    use admin  

    db.auth("admin","admin")  
    创建新数据库
    use test#创建新数据库  
    #查看所有数据库,没有看到test,插入一条数据才能看到
    db.createUser(  
      {  
        user: "testwjb",  
        pwd: "testwjb",  
        roles: [ { role: "dbOwner", db: "test" } ]  
      }  
    )  

    db.auth("testwjb","testwjb")  
    db.wjbdb.insert({"name":"iamtest"})
    show dbs#此时已看到test数据库
    删除数据库
    use test#切换当前数据库
    db.dropDatabase()

    robomongo客户端软件连接:
    地址:https://robomongo.org/download
    user: "testwjb",pwd: "testwjb"连接即可


    创建集合

    db.createCollection(name, options)
    创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
    db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
    查看已有集合
    show collections
    在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
    db.wjbdb.insert({"info":"username"})
    删除集合
    db.collection.drop()
    插入文档
    db.COLLECTION_NAME.insert(document)
    查看已插入文档
    db.wjbdb.find()
    { "_id" : ObjectId("5a9e33ffeb3c44f60d55c866"), "name" : "123123123" }
    { "_id" : ObjectId("5a9e3500eb3c44f60d55c868"), "title" : "come on!" }
    { "_id" : ObjectId("5a9e472df04f6c4684097865"), "info" : "username" }
    也可以将数据定义成一个变量:
    document=({title: '标题',
        description: 'MongoDB 是一个 Nosql 数据库',
        by: 'Allen',
        url: 'http://www.baidu.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    });
    db.wjbdb.insert(document)
    更新文档
    update() 方法
    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>
       }
    )
    参数说明:
    *         query : update的查询条件,类似sql update查询内where后面的。
    *         update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    *         upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    *         multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    *         writeConcern :可选,抛出异常的级别。

    db.wjbdb.update({"title":'标题'},{$set:{'title':'我的新标题'}})
    save() 方法
    db.collection.save(
       <document>,
       {
         writeConcern: <document>
       }
    )
    参数说明:
    *         document : 文档数据。
    *         writeConcern :可选,抛出异常的级别。
    db.wjbdb.save({"_id" : ObjectId("5a9e4b6af04f6c4684097867"),
        title: '标题123123',
        description: 'MongoDB 是一个 Nosql 数据库',
        by: 'Allen',
        url: 'http://www.baidu.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    });
    db.wjbdb.find().pretty()#查看更新后的格式化后的数据
    删除文档
    remove()
    db.collection.remove(
       <query>,
       {
         justOne: <boolean>,
         writeConcern: <document>
       }
    )
    参数说明:
    *         query :(可选)删除的文档的条件。
    *         justOne : (可选)如果设为 true 或 1,则只删除一个文档。
    *         writeConcern :(可选)抛出异常的级别。

    db.wjbdb.remove({"title" : "save标题"})
    查询:
    *         query :可选,使用查询操作符指定查询条件
    *         projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

    db.collection.find(query, projection)

    db.col.find().pretty()

    查询条件操作符:
    *         (>) 大于 - $gt
    *         (<) 小于 - $lt
    *         (>=) 大于等于 - $gte
    *         (<= ) 小于等于 - $lte

    db.col.find({"likes" : {$gt : 100}})
    MongoDB 中可以使用的类型如下表所示:
    类型                  数字    备注
    Double                1     
    String                 2     
    Object                3     
    Array                  4     
    Binary data         5     
    Undefined           6    已废弃。
    Object id            7     
    Boolean             8     
    Date                  9     
    Null                  10     
    Regular Expression    11     
    JavaScript        13     
    Symbol            14     
    JavaScript (with scope)    15     
    32-bit integer    16     
    Timestamp        17     
    64-bit integer    18     
    Min key            255    Query with -1.
    Max key            127     

    如果想获取 "wjbdb" 集合中 title 为 String 的数据
    db.wjbdb.find({"title":{$type:2}}).pretty()
    MongoDB Limit() 方法
    db.COLLECTION_NAME.find().limit(NUMBER)
    >db.wjbdb.find({},{"title":1,_id:0}).limit(3)
    {  }
    { "title" : "come on!" }
    {  }
    MongoDB Skip() 方法
    db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
    > db.wjbdb.find({},{"title":1,_id:0}).skip(1)
    { "title" : "come on!" }
    {  }
    { "title" : "标题123123" }
    { "title" : "save标题" }
    排序
    sort()方法
    db.COLLECTION_NAME.find().sort({KEY:1})
    > db.wjbdb.find({},{"title":1,_id:0}).sort({"likes":-1})
    { "title" : "标题123123" }
    { "title" : "save标题" }
    {  }
    { "title" : "come on!" }
    {  }
    索引
    ensureIndex() 方法
    db.COLLECTION_NAME.ensureIndex({KEY:1})
    语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
    ensureIndex() 接收可选参数,可选参数列表如下:
    Parameter    Type            Description
    background    Boolean    建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。
    unique            Boolean    建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
    name             string    索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
    dropDups        Boolean    在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
    sparse            Boolean    对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
    expireAfterSeconds    integer    指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
    v                    index version    索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
    weights        document    索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
    default_language    string    对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
    language_override    string    对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

    db.wjbdb.ensureIndex({"title":1},{background:true})
    >{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 2,
        "ok" : 1
    }

    聚合

    aggregate() 方法
    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
    集合中的数据如下:
    {
       _id: ObjectId(7df78ad8902c)
       title: 'MongoDB Overview',
       description: 'MongoDB is no sql database',
       by_user: 'runoob.com',
       url: 'http://www.runoob.com',
       tags: ['mongodb', 'database', 'NoSQL'],
       likes: 100
    },
    {
       _id: ObjectId(7df78ad8902d)
       title: 'NoSQL Overview',
       description: 'No sql database is very fast',
       by_user: 'runoob.com',
       url: 'http://www.runoob.com',
       tags: ['mongodb', 'database', 'NoSQL'],
       likes: 10
    },
    {
       _id: ObjectId(7df78ad8902e)
       title: 'Neo4j Overview',
       description: 'Neo4j is no sql database',
       by_user: 'Neo4j',
       url: 'http://www.neo4j.com',
       tags: ['neo4j', 'database', 'NoSQL'],
       likes: 750
    },
    现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
    > db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])


    >
    以上实例类似sql语句: select by_user, count(*) from mycol group by by_user
    在上面的例子中,我们通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和。
    下表展示了一些聚合的表达式:
    表达式    描述                实例
    $sum    计算总和。    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
    $avg        计算平均值    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
    $min        获取集合中所有文档对应值得最小值。    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
    $max    获取集合中所有文档对应值得最大值。    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
    $push    在结果文档中插入值到一个数组中。    db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
    $addToSet    在结果文档中插入值到一个数组中,但不创建副本。    db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
    $first        根据资源文档的排序获取第一个文档数据。    db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
    $last        根据资源文档的排序获取最后一个文档数据    db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-9 00:00 , Processed in 0.081270 second(s), 32 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表