• mongodb常用操作


     

    一、部署mongodb

    1.创建文件夹

    /opt/mongodb/single

    /opt/mongodb/data/db

    2.进入single目录下载安装包

    //下载 tar.gz文件

    wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.6.tgz

    3.解压 并修改文件名

    mv mongodb-linux-x86_64-2.4.6 mongo

    4.进入mongo目录

    5.创建日志目录

    mkdir  log

    6.创建配置文件

    mkdir conf

    cd conf

    vim conf.properties

    #端口

    port=27017

    #db存放的目录

    dbpath=/opt/mongotest/data/db

    #后台启动需要配置日志输出

    logpath=/opt/mongotest/single/mongo/log/mongo.log

    #日志模式

    logappend=true

    #设置成后台启动

    fork=true

    7.启动mongo

    mongo目录执行

    ./bin/mongod -f conf/conf.properties 

    启动mongodb

    日志输出:

    ./bin/mongod -f conf/conf.properties

    about to fork child process, waiting until server is ready for connections.

    forked process: 30695

    all output going to: /opt/mongodb/single/mongo/log/mongo.log

    child process started successfully, parent exiting

    启动成功

    查看进程:

    ps -ef|grep mongo

    root     30695     1  0 09:59 ?        00:00:00 ./bin/mongod -f conf/conf.properties

    root     30707 30275  0 09:59 pts/0    00:00:00 grep mongo

     

    更改端口后登录:

    ./mongo --port 37017

     

    关闭 MongoDB 服务

    1、登录数据库:

      > use admin;
    switched to db admin

    db.shutdownServer();

    2、使用 mongod 命令关闭

     mongod  --shutdown  --dbpath /database/mongodb/data/

    3、使用kill命令:使用操作系统的 kill 命令,给 mongod 进程发送 SIGINT 或 SIGTERM 信号,
                 即 "kill -2 PID," 或者 “kill -15 PID“。
                建议不要使用 ”kill -9 pid“,因为如果 MongoDB 运行在没开启日志(--journal)的情况下,
                可能会造成数据损失。

     

    二、日常操作:

    1.连接mongodb

    mongo/bin目录下执行

    ./mongo

    2.查看数据库

    show dbs

    3.查看当前所在数据库

    db

    4.创建数据库

    use openfire (临时创建如果不做操作则离开后被系统删除)

    5.在当前数据库删除当前数据库

    db.dropDatabase()

    { "dropped" : "test2", "ok" : 1 }

    6.查看当前库的所有用户

    show users

    > show users

    {

           "_id" : ObjectId("5dafc6de1bb4191b344175cf"),

           "user" : "test",

           "readOnly" : false,

           "pwd" : "a6de521abefc2fed4f5876855a3484f5"

    }

    7.查看集合(或者叫表)

    show collections

    8.创建集合

    db.createCollection(“mycollection”)

    9.创建集合并制定集合的属性

    db.createCollection(“mycol”, { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )

    字段 类型 描述

    capped   Boolean  (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。

    autoIndexID  Boolean  (可选)如果为true,自动创建索引_id字段的默认值是false。

    size number  (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。

    max       number  (可选)指定封顶集合允许在文件的最大数量。

    10.另一种创建集合

    (当插入一条数据时,不存在mongodb会帮我们创建,和创建数据库同理)

    db.MySecondCollection.insert({“name” : “ming”})

     

    11.删除当前库的一个集合

    db.CollectionName.drop()

     

    12.插入一条数据

    db.MyFirstCollection.insert({“_id”:”3”,”title”:”mongotest”,”description”:”this is test”})

    注意:插入的都是JSON形式的,所以一定要用{},否则会报错:

    Sat Mar 19 14:22:39.160 SyntaxError: Unexpected token :

     

    13.插入一条_id存在的数据

    db.MyFirstCollection.insert({“_id”:”3”,”title”:”mm”})

    输出:E11000 duplicate key error index: openfire.MyFirstCollection.$_id_ dup key: { : “3” }

    解释:_id即是mongodb的默认主键,默认自动生成,我们可以直接设置以达到我们想要的目的

    db.mycol.insert({"id":"3","name":"tom"})

    > db.mycol.find();

    { "_id" : ObjectId("5dafeaca282e5603fa63eb82"), "id" : "3", "name" : "tom" }

    { "_id" : ObjectId("5dafed57282e5603fa63eb83"), "id" : "3", "name" : "tom" }

    { "_id" : ObjectId("5dafed5a282e5603fa63eb84"), "id" : "3", "name" : "tom" }

    问:插入一条和原来集合完全不一样的数据可以吗?

    答:可以,所以我们要在程序中规避,手动指定我们一个集合里面的字段,否则就无法实现查询及其他功能了

    > db.MyFirstCollection.insert({"newTitle":"null"})

    > db.MyFirstCollection.find();

    { "_id" : "3", "title" : "new title", "description" : "this is test" }

    { "_id" : ObjectId("56ecf4fe0dceecace97c4506"), "newTitle" : "null" }

    14.查看集合第一条记录

    db.MySecondCollection.findOne();

    输出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }

     

    15.查找一条/多条特定数据

    db.MySecondCollection.findOne({“name”:”ming”})

    输出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }

     

    16.更新一条记录

    db.MyFirstCollection.update({“title”:”mongotest”},{$set:{“title”:”new title”}},true,false)

    结果:

    db.MyFirstCollection.findOne()

    { “_id” : “3”, “title” : “new title”, “description” : “this is test” }

     

    update详解

    db.collection.update(criteria,objNew,upsert,multi)

     

    criteria:查询条件

    objNew:update对象和一些更新操作符

    upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。

    multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

     

    更新操作符:

    1.$inc

    用法:{$inc:{field:value}}

    作用:对一个数字字段的某个field增加value

    示例:db.students.update({name:"student"},{$inc:{age:5}}) 

     

    2.$set

    用法:{$set:{field:value}}

    作用:把文档中某个字段field的值设为value

    示例:db.students.update({name:"student"},{$set:{age:23}})

     

    3.$unset

    用法:{$unset:{field:1}}

    作用:删除某个字段field

    示例: db.students.update({name:"student"},{$unset:{age:1}})

     

    4.$push

    用法:{$push:{field:value}}

    作用:把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型

    示例:db.students.update({name:"student"},{$push:{"title":"major"}}

     

    5.$rename

    用法:{$rename:{old_field_name:new_field_name}}

    作用:对字段进行重命名(不是值,是字段)

    示例:db.students.update({name:"student"},{$rename:{"name":"newname"}})

    设置用户权限及访问

    1.给admin添加用户

     

    切换到admin库:use admin

    添加admin用户:db.addUser(root,admin)

     

    注意:必须先给admin库添加用户,否则就算给具体的库添加了用户,后续进入依然能操作具体库.

    因为默认admin库用户具有最高权限,相当于具体库需要认证时,进入的用户持有的是admin的权限,所以无需认证依然能进行操作.

     

    2.给具体库添加用户

     

    use openfire

    db.addUser("openfire","password")

    1

    2

    3.重启mongo并在启动时配置需要认证

     

    方法一:退出重启并加上auth参数

    ./bin/mongod -f conf/conf.properties –auth(注意是两个-)

     

    方法二:修改配置文件,加上参数(推荐)

    auth=true

     

    3.测试权限

     

    >use openfire

    >db.MySecondCollection.findOne();

     

    Sat Mar 19 14:04:55.653 error: {

        "$err" : "not authorized for query on openfire.MySecondCollection",

        "code" : 16550

    } at src/mongo/shell/query.js:128

    4.认证并操作

     

    //此处应该设置成更加恰当的用户名及密码

    > db.auth("openfire","password")

    1

    > db.MySecondCollection.findOne()

    { "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }

    5.另一种方法认证

     

    在进入mongo时候加上数据库及用户名、密码

    ./bin/mongo openfire -uopenfire -ppassword

     

    root@test:/opt/mongotest/single/mongo# ./bin/mongo openfire -uopenfire -ppassword

    MongoDB shell version: 2.4.6

    connecting to: openfire

    > db

    openfire

    > db.MySecondCollection.findOne()

    { "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }

     

    mongdb进阶

    1.find()指定返回字段

    作用:减少流量

     

    如果key:value,返回的value是个非常大的JSON,而我们不需要这么多字段,也许我们只需要其中的一个.

     

    那么使用projection来过滤:

    db.collection.find(query, projection) 此处projection就是返回值的过滤条件

     

    参数 类型 描述

    query     文档 可选. 使用查询操作符指定查询条件

    projection     文档 可选.使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略).

    返回值: 匹配查询条件的文档集合的游标. 如果指定投影参数,查询出的文档返回指定的键 ,”_id”键也可以从集合中移除掉。

    _id不指定的话,总是会返回.

    1或者true代表返回,0或者false代表不返回

     

    示例:

    db.MyFirstCollection.findOne({“title”:”new title”},{“description”:1,”_id”:0});

    { “description” : “this is test” }

     

    也可以使用表达式:

    db.MyFirstCollection.findOne({“title”:”new title”},{Items:{“$slice”:[3,1]}});

    ————————————————版本区别

    2.x添加用户:db.addUser("test","test");

    {

           "user" : "test",

           "readOnly" : false,

           "pwd" : "a6de521abefc2fed4f5876855a3484f5",

           "_id" : ObjectId("5dafc6de1bb4191b344175cf")

    }

    3.x:

    db.createUser(

         {

         user: "dba",

          pwd: "dba",

          roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

        }

     )

    认证方式登录test库

    ./mongo -u test -p --authenticationDatabase test

    MongoDB shell version: 2.4.6

    Enter password:

    connecting to: test

    > use test

    switched to db test

    > db.auth("test","test")

    1

     

    explain查看查询:

     > db.users.find({"username":"dede"}).explain('executionStats')

    创建索引:

    mongodb的索引分为单建索引db.users. createIndex({age:-1}); 、复合索引db.users. createIndex({username:1,age:-1,country:1});、多键索引(在数组的属性上建立索引)db.users. createIndex({favorites.city:1}),
    创建索引的语法如下:
    db.collection.createIndex(keys, options)

    导入文件

    mongoimport -d wash -c ws_server_area -u washadmin -pwash@admin!@# C:mongodbws_server_area.dat

  • 相关阅读:
    学习PyQt5(二):PyQt5布局管理
    学习PyQt5(一):安装PyQt5以及在PyCharm上配置PyQt5
    Day037--Python--线程的其他方法,GIL, 线程事件,队列,线程池,协程
    Day036--Python--线程
    Day035--Python--管道, Manager, 进程池, 线程切换
    Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
    Day033--Python--进程
    Day032--Python--操作系统, process进程
    Day30--Python--struct, socketserver
    Day29--Python--缓冲区, 粘包
  • 原文地址:https://www.cnblogs.com/zhxiaoxiao/p/11726666.html
Copyright © 2020-2023  润新知