MongoDB-基本命令

1、基本命令

# 显示当前数据库服务器上的数据库
show dbs

# 切换到指定数据库pagedb的上下文,可以在此上下文中管理pagedb数据库以及其中的集合等
use pagedb

# 显示数据库中所有的集合(collection)
show collections

# 查看数据库服务器的状态。有时,通过查看数据库服务器的状态,可以判断数据库是否存在问题,如果有问题,如数据损坏,可以及时执行修复。
db.serverStatus()

# 查询指定数据库统计信息,查询结果示例如下所示:
> use fragment
switched to db fragment
> db.stats()
{
    "db" : "fragment",
    "collections" : 0,
    "objects" : 0,
    "avgObjSize" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "fileSize" : 0,
    "ok" : 1
}

# 查询指定数据库包含的集合名称列表,结果如下所示:
> db.getCollectionNames() 
[ 
        "17u", 
        "baseSe", 
        "bytravel", 
        "daodao", 
        "go2eu", 
        "lotour", 
        "lvping", 
        "mafengwo", 
        "sina", 
        "sohu", 
        "system.indexes" 
] 

2、基本DDL和DML

2.1 创建数据库

# 如果你习惯了关系型数据库,你可能会寻找相关的创建数据库的命令。在MongoDB中,你可以直接通过use dbname来切换到这个数据库上下文下面,系统会自动延迟创建该数据库,例如:
> show dbs 
local  0.078GB
> use LuceneIndexDB 
switched to db LuceneIndexDB
> show dbs
local  0.078GB
> db
LuceneIndexDB
> db.storeCollection.save({'version':'3.5', 'segment':'e3ol6'})
WriteResult({ "nInserted" : 1 })
> show dbs
LuceneIndexDB  0.078GB
local          0.078GB
>

可见,在use指定数据库后,并且向指定其中的一个集合并插入数据后,数据库和集合都被创建了。

2.2 删除数据库

直接使用db.dropDatabase()即可删除数据库。

2.3 创建集合

可以使用命令db.createCollection(name, { size : ..., capped : ..., max : ... } )创建集合,示例如下所示:
> db.createCollection('replicationColletion', {'capped':true, 'size':10240, 'max':17855200})
{ "ok" : 1 }
> show collections 
replicationColletion
storeCollection
system.indexes

2.4 删除集合

删除集合,可以执行db.mycoll.drop()。

2.5 插入更新记录

直接使用集合的save方法,如下所示:
> db.storeCollection.save({'version':'3.5', 'segment':'e3ol6'})
WriteResult({ "nInserted" : 1 })

更新记录,使用save会将原来的记录值进行覆盖实现记录更新。

2.6 查询一条记录

使用findOne()函数,参数为查询条件,可选,系统会随机查询获取到满足条件的一条记录(如果存在查询结果数量大于等于1)示例如下所示:

> db.storeCollection.findOne({'version':'3.5'}) 
{
    "_id" : ObjectId("5a4c1733f5c45f057ae82292"),
    "version" : "3.5",
    "segment" : "e3ol6"
}

2.7 查询多条记录

使用find()函数,参数指定查询条件,不指定条件则查询全部记录。

2.8 删除记录

使用集合的remove()方法,参数指定为查询条件,示例如下所示:

	
> db.storeCollection.remove({'version':'3.5'}) 
WriteResult({ "nRemoved" : 2 })
> db.storeCollection.findOne() 
null

2.9 创建索引

可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:

> use pagedb
switched to db pagedb
> db.page.ensureIndex({'title':1, 'url':-1}) 
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.system.indexes.find() 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "pagedb.page" }
{ "v" : 1, "key" : { "title" : 1, "url" : -1 }, "name" : "title_1_url_-1", "ns" : "pagedb.page" }

上述,ensureIndex方法参数中,数字1表示升序,-1表示降序。
使用db.system.indexes.find()可以查询全部索引。

2.10 查询索引

我们为集合建立的索引,那么可以通过集合的getIndexes()方法实现查询,示例如下所示:

> db.page.getIndexes() 
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "pagedb.page"
    },
    {
        "v" : 1,
        "key" : {
            "title" : 1,
            "url" : -1
        },
        "name" : "title_1_url_-1",
        "ns" : "pagedb.page"
    }
]

当然,如果需要查询系统中全部的索引,可以使用db.system.indexes.find()函数。

2.11 删除索引

删除索引给出了两个方法:

> db.mycoll.dropIndex(name)
2018-01-02T23:45:50.155+0000 E QUERY    ReferenceError: name is not defined
    at (shell):1:21
> db.mycoll.dropIndexes() 
{ "ok" : 0, "errmsg" : "ns not found" }
>

第一个通过指定索引名称,第二个删除指定集合的全部索引。

2.12 索引重建

可以通过集合的reIndex()方法进行索引的重建,示例如下所示:

> db.page.reIndex() 
{
    "nIndexesWas" : 2,
    "nIndexes" : 2,
    "indexes" : [
        {
            "key" : {
                "_id" : 1
            },
            "name" : "_id_",
            "ns" : "pagedb.page"
        },
        {
            "key" : {
                "title" : 1,
                "url" : -1
            },
            "name" : "title_1_url_-1",
            "ns" : "pagedb.page"
        }
    ],
    "ok" : 1
}

2.13 统计集合记录数

> use fragment
switched to db fragment
> db.baseSe.count()
36749

 

上述统计了数据库fragment的baseSe集合中记录数。

2.14 查询并统计结果记录数

> use fragment
switched to db fragment
> db.baseSe.find().count()
36749

find()可以提供查询参数,然后查询并统计结果。上述执行先根据查询条件查询结果,然后统计了查询数据库fragment的baseSe结果记录集合中记录数。

2.15 查询指定数据库的集合当前可用的存储空间

> use fragment
switched to db fragment
> db.baseSe.storageSize()
142564096

2.16 查询指定数据库的集合分配的存储空间

> db.baseSe.totalSize()
144096000

上述查询结果中,包括为集合(数据及其索引存储)分配的存储空间。

3、启动与终止

3.1 正常启动

[root@centos6-vm01 ~]# mongod --dbpath /data/db --logfile /var/mongo.log
说明:指定数据存储目录和日志目录

如果采用安全认证模式,需要加上--auth选项,如:
[root@centos6-vm01 ~]# mongod --auth --dbpath /data/db --logfile /var/mongo.log

3.2 以修复模式启动

[root@centos6-vm01 ~]# mongod --repair
以修复模式启动数据库。

实际很可能数据库数据损坏或数据状态不一致,导致无法正常启动MongoDB服务器,根据启动信息可以看到需要进行修复。或者执行:
[root@centos6-vm01 ~]# mongod -f /etc/mongodb.conf --repair

3.3 终止服务器进程

> db.shutdownServer()
终止数据库服务器进程。或者,可以直接kill掉mongod进程即可。

4、安全管理

4.1 以安全认证模式启动

[root@centos6-vm01 ~]# mongod --auth --dbpath /usr/mongo/data --logfile /var/mongo.log
使用--auth选项启动mongod进程即可启用认证模式。
或者,也可以修改/etc/mongodb.conf,设置auth=true,重启mongod进程。

4.2 添加用户

> db.createUser({user: "admin",pwd: "1234!@#$qwer",roles: [ "readWrite", "dbAdmin" ]})
添加数据库用户,添加成功,则显示结果如下所示:

> db.createUser({user: "admin",pwd: "1234!@#$qwer",roles: [ "readWrite", "dbAdmin" ]})
Successfully added user: { "user" : "admin", "roles" : [ "readWrite", "dbAdmin" ] }

4.3 安全认证

前提是必须进入该用户对应的database才行,出现1代表成功
> db.auth("admin", "1234!@#$qwer")
数据库安全认证。认证成功显示结果:

> use admin
switched to db admin
> db.auth("admin", "1234!@#$qwer")

如果是认证用户,执行某些命令,可以看到正确执行结果,如下所示:

> db.system.users.find() 
{ "_id" : "fragment.admin", "user" : "admin", "db" : "fragment", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "/QZtFAvcavqZIm15FmbToA==", "storedKey" : "t91XZuIrnUYtuN1bG+hNg58R+w0=", "serverKey" : "vZLGW0nVpGSKfUHsS2RABOXhOb4=" } }, "roles" : [ { "role" : "readWrite", "db" : "fragment" }, { "role" : "dbAdmin", "db" : "fragment" } ] }

4.4、为数据库写数据(同步到磁盘)加锁

> db.runCommand({fsync:1,lock:1})
说明:该操作已经对数据库上锁,不允许执行写数据操作,一般在执行数据库备份时有用。执行命令,结果示例如下:

> db.runCommand({fsync:1,lock:1})
{
    "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
    "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
    "ok" : 1
}

4.5 查看当前锁状态

> db.currentOp()
说明:查询结果如下所示:

> db.currentOp()
{
    "inprog" : [ ],
    "fsyncLock" : true,
    "info" : "use db.fsyncUnlock() to terminate the fsync write/snapshot lock"
}

其中,fsyncLock为1表示MongoDB的fsync进程(负责将写入改变同步到磁盘)不允许其他进程执行写数据操作

4.6 解锁

> use admin
> db.$cmd.sys.unlock.findOne()
说明:执行解锁,结果如下所示:

	
> use admin
switched to db admin
> db.$cmd.sys.unlock.findOne()
{ "ok" : 1, "info" : "unlock completed" }

可以执行命令查看锁状态:
db.currentOp()
状态信息如下:

	
> db.currentOp()
{ "inprog" : [ ] }

说明当前没有锁,可以执行写数据操作。
posted @ 2021-11-29 13:17  Rocky_940120  阅读(374)  评论(0)    收藏  举报