Mongodb 安装与使用

本文详细介绍了 MongoDB 的关键操作与用户认证机制,包括安装依赖、编译与安装、基本数据库操作、创建与管理用户等核心内容。通过实际例子展示了如何添加、验证、授权用户,并操作数据库及数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 安装依赖
apt-get install scons libboost-dev libboost-thread-dev libboost-filesystem-dev libboost-program-options-dev libpcre++-dev

2.进入源码目录执行:
scons all (时间很长,2.8M的源码,编译之后1.3G)
scons –prefix=/usr/server/mongodb –full install (安装后目录大概111M)

3.使用:
mkdir /data/mongodb (创建数据库路径)
/usr/server/mongodb/bin/mongod –dbpath /data/mongodb & (启动数据库监听服务)

/usr/server/mongodb/bin/mongo (启动客户端)

use mydb; (创建数据库)
db.usr.insert({'name':'tompig'}); (插入数据)
show collections;  (查看‘表‘)
show dbs; (查看库)

添加用户认证
添加用户认证必须在启动 mongod 服务时添加 –auth 参数:
/usr/server/mongodb/bin/mongod –dbpath /data/mongodb –auth

注意所有用户的认证信息都保存在每一个数据库的 system.users
集合中。例如:在数据库 projectx 中(就是 use projectx
后)projectx.system.users 会保存所有用户的信息(这里的用户是数据库用户)。

在最初始的时候 mongodb 都默认有一个 admin 数据库(刚开始是空的),而
admin.system.users 中将会保存比在其它数据库中设置的用户权限更大的用户信息。

注意:当 admin.system.users 中没有添加任一一个用户(即为空)时,即使 mongod
启动时添加了 –auth 参数,即使,在除 admin
数据库中添加了用户,此时不进行任何认证依然可以使用任何操作,直到你在
admin.system.users 中添加了一个用户。
如下分别创建两个用户:

在 projectx 中创建用户名为 user1 密码为 1resu 的用户,如下:

$ ./mongo
> use projectx
> db.addUser(“user1″,”1resu”);

在 admin 中创建用户名为 root 密码为 toor 的用户,如下:

$ ./mongo
> use admin
> db.addUser(“root”, “toor”);
> db.auth(“root”, “toor”);
1

^^^^ 如果认证成功会显示 1
^^^^ 用以下命令可以查看所有当前选择的数据库的用户信息

> db.system.users.find();
{ “_id” : ObjectId(“4d761dfc23e14f10be8563c5″), “user” : “root”, “readOnly” :
false, “pwd” : “6a921fa21bbcd22989efecbcb2340d17″ }

$ ./mongo
> use projectx
switched to db dbtest
> db.aaaa.insert({aa:”xx”});
unauthorized

^^^^ 一旦在 admin 数据库中添加了用户,
^^^^ 那么对数据库的操作必须进行认证,否则提示 unauthorized

> db.auth(“user1″,”1resu”);
1
> db.aaaa.insert({aa:”xx”});
> db.aaaa.find();
{ “_id” : ObjectId(“4d7628638e6ce2eb56b45a41″), “aa” : “xx” }

^^^^ 进行用户认证后就可以插入数据了

> use projecty
switched to db projecty
> db.zzz.insert({aa:”xx”});
unauthorized

^^^^ 由于用户 user1 只作用于 projectx
^^^^ 并没有对 projecty 的操作权限
^^^^ 而我们却可以用 admin 库中的用户认证后进行创建,如下

> use admin
> db.auth(“root”,”toor”);
1
> use projecty
switched to db projecty
> db.zzz.insert({aa:”xx”});
> db.zzz.find();
{ “_id” : ObjectId(“4d7628638e6ce2eb56b45a41″), “aa” : “xx” }

^^^^ 用 admin 库中的用户认证后就可以创建另一个数据库了
^^^^ 所以说明 admin 数据库中的权限很大,如果没有指定 readonly 的话
^^^^ 它可以进行任何操作,很危险

> use projectx
> db.addUser(“user2″,”2resu”, true);
{
    “user” : “user2″,
    “readOnly” : true,
    “pwd” : “471e31e021a3656044ef3487ea90e0cf”
}

^^^^ 当一 user2 用户认证时,user2 只能对 projectx 进行只读操作。

我的例子:
/usr/server/mongodb/bin/mongod –dbpath /data/mongodb –auth
/usr/server/mongodb/bin/mongo
show dbs
use admin
db.addUser(“root”, “123456″)
db.auth(“root”, “123456″) (创建了用户密码后,之后的插入一系列操作需要先做认证)
db.system.users.find()
exit

/usr/server/mongodb/bin/mongo
use mydb
db.addUser(“mydb”, “123456″)
db.test.insert({“test”:”OKOKOKOK”})
db.auth(“mydb”, “123456″)
db.test.insert({“test”:”OKOKOKOK”})
db.test.find()

Running as a Daemon:
/usr/server/mongodb/bin/mongod –dbpath /data/mongodb –auth –fork –logpath /var/log/mongodb.log –logappend
stop:
> use admin
> db.auth(“root”, “123456″)
> db.shutdownServer()

http://blog.youkuaiyun.com/kindy1022/article/details/6430768

 熟悉MongoDB的数据操作语句,类sql

数据库操作语法

mongo –path

db.addUser(username,password)  添加用户

db.auth(usrename,password)     设置数据库连接验证

db.cloneDataBase(fromhost)     从目标服务器克隆一个数据库

db.commandHelp(name)           returns the help for the command

db.copyDatabase(fromdb,todb,fromhost)
复制数据库fromdb—源数据库名称,todb—目标数据库名称,fromhost—源数据库服务器地址

db.createCollection(name,{size:3333,capped:333,max:88888})
创建一个数据集,相当于一个表

db.currentOp()                 取消当前库的当前操作

db.dropDataBase()              删除当前数据库

db.eval(func,args)             run code server-side

db.getCollection(cname)        取得一个数据集合,同用法:db['cname'] or
db.cname

db.getCollenctionNames()       取得所有数据集合的名称列表

db.getLastError()              返回最后一个错误的提示消息

db.getLastErrorObj()           返回最后一个错误的对象

db.getMongo()                  取得当前服务器的连接对象get the server
connection object

db.getMondo().setSlaveOk()     allow this connection to read from then
nonmaster membr of a replica pair

db.getName()                   返回当操作数据库的名称

db.getPrevError()              返回上一个错误对象

db.getProfilingLevel()         ?什么等级

db.getReplicationInfo()        ?什么信息

db.getSisterDB(name)           get the db at the same server as this onew

db.killOp()                    停止(杀死)在当前库的当前操作

db.printCollectionStats()      返回当前库的数据集状态

db.printReplicationInfo()

db.printSlaveReplicationInfo()

db.printShardingStatus()       返回当前数据库是否为共享数据库

db.removeUser(username)        删除用户

db.repairDatabase()            修复当前数据库

db.resetError()               

db.runCommand(cmdObj)          run a database command. if cmdObj is a string,
turns it into {cmdObj:1}

db.setProfilingLevel(level)    0=off,1=slow,2=all

db.shutdownServer()            关闭当前服务程序

db.version()                   返回当前程序的版本信息

 

数据集(表)操作语法

db.linlin.find({id:10})          返回linlin数据集ID=10的数据集

db.linlin.find({id:10}).count()  返回linlin数据集ID=10的数据总数

db.linlin.find({id:10}).limit(2)
返回linlin数据集ID=10的数据集从第二条开始的数据集

db.linlin.find({id:10}).skip(8)
返回linlin数据集ID=10的数据集从0到第八条的数据集

db.linlin.find({id:10}).limit(2).skip(8)
返回linlin数据集ID=1=的数据集从第二条到第八条的数据

db.linlin.find({id:10}).sort()   返回linlin数据集ID=10的排序数据集

db.linlin.findOne([query])       返回符合条件的一条数据

db.linlin.getDB()                返回此数据集所属的数据库名称

db.linlin.getIndexes()           返回些数据集的索引信息

db.linlin.group({key:…,initial:…,reduce:…[,cond:...]})

db.linlin.mapReduce(mayFunction,reduceFunction,
)

db.linlin.remove(query)                      在数据集中删除一条数据

db.linlin.renameCollection(newName)          重命名些数据集名称

db.linlin.save(obj)                          往数据集中插入一条数据

db.linlin.stats()                            返回此数据集的状态

db.linlin.storageSize()                      返回此数据集的存储大小

db.linlin.totalIndexSize()                   返回此数据集的索引文件大小

db.linlin.totalSize()                        返回些数据集的总大小

db.linlin.update(query,object[,upsert_bool]) 在此数据集中更新一条数据                        

db.linlin.validate()                         验证此数据集                                       

db.linlin.getShardVersion()                  返回数据集共享版本号

 

db.linlin.find({'name':'foobar'})    select * from linlin where name='foobar'

db.linlin.find()                     select * from linlin

db.linlin.find({'ID':10}).count()    select count(*) from linlin where ID=10

db.linlin.find().skip(10).limit(20)  从查询结果的第十条开始读20条数据  select
* from linlin limit 10,20  ———-mysql

db.linlin.find({'ID':{$in:[25,35,45]}})  select * from linlin where ID in
(25,35,45)

db.linlin.find().sort({'ID':-1})      select * from linlin order by ID desc

db.linlin.distinct('name',{'ID':{$lt:20}})   select distinct(name) from linlin
where ID<20

 

db.linlin.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})

select name,sum(marks) from linlin group by name

db.linlin.find('this.ID<20',{name:1})     select name from linlin where ID<20

 

db.linlin.insert({'name':'foobar','age':25})  insert into linlin
('name','age') values('foobar',25)

db.linlin.insert({'name':'foobar','age':25,'email':'cclove2@163.com'})

 

db.linlin.remove({})                   delete * from linlin

db.linlin.remove({'age':20})           delete linlin where age=20

db.linlin.remove({'age':{$lt:20}})     delete linlin where age<20

db.linlin.remove({'age':{$lte:20}})    delete linlin where age<=20

db.linlin.remove({'age':{$gt:20}})     delete linlin where age>20

db.linlin.remove({'age':{$gte:20}})    delete linlin where age>=20

db.linlin.remove({'age':{$ne:20}})     delete linlin where age!=20

 

db.linlin.update({'name':'foobar'},{$set:{'age':36}})  update linlin set
age=36 where name='foobar'

db.linlin.update({'name':'foobar'},{$inc:{'age':3}})   update linlin set
age=age+3 where name='foobar'

 

官方提供的操作语句对照表:

 

上行:SQL 操作语句

下行:Mongo 操作语句

CREATE TABLE USERS (a Number, b Number)

db.createCollection(“mycoll”)

 

INSERT INTO USERS VALUES(1,1)

db.users.insert({a:1,b:1})

 

SELECT a,b FROM users

db.users.find({}, {a:1,b:1})

 

SELECT * FROM users

db.users.find()

 

SELECT * FROM users WHERE age=33

db.users.find({age:33})

 

SELECT a,b FROM users WHERE age=33

db.users.find({age:33}, {a:1,b:1})

 

SELECT * FROM users WHERE age=33 ORDER BY name

db.users.find({age:33}).sort({name:1})

 

SELECT * FROM users WHERE age>33

db.users.find({'age':{$gt:33}})})

 

SELECT * FROM users WHERE age<33

db.users.find({'age':{$lt:33}})})

 

SELECT * FROM users WHERE name LIKE "%Joe%"

db.users.find({name:/Joe/})

 

SELECT * FROM users WHERE name LIKE "Joe%"

db.users.find({name:/^Joe/})

 

SELECT * FROM users WHERE age>33 AND age<=40

db.users.find({'age':{$gt:33,$lte:40}})})

 

SELECT * FROM users ORDER BY name DESC

db.users.find().sort({name:-1})

 

SELECT * FROM users WHERE a=1 and b='q'

db.users.find({a:1,b:'q'})

 

SELECT * FROM users LIMIT 10 SKIP 20

db.users.find().limit(10).skip(20)

 

SELECT * FROM users WHERE a=1 or b=2

db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )

 

SELECT * FROM users LIMIT 1

db.users.findOne()

 

SELECT DISTINCT last_name FROM users

db.users.distinct('last_name')

 

SELECT COUNT(*y) FROM users

db.users.count()

 

SELECT COUNT(*y) FROM users where AGE > 30

db.users.find({age: {'$gt': 30}}).count()

 

SELECT COUNT(AGE) from users

db.users.find({age: {'$exists': true}}).count()

 

CREATE INDEX myindexname ON users(name)

db.users.ensureIndex({name:1})

 

CREATE INDEX myindexname ON users(name,ts DESC)

db.users.ensureIndex({name:1,ts:-1})

 

EXPLAIN SELECT * FROM users WHERE z=3

db.users.find({z:3}).explain()

 

UPDATE users SET a=1 WHERE b='q'

db.users.update({b:'q'}, {$set:{a:1}}, false, true)

 

UPDATE users SET a=a+2 WHERE b='q'

db.users.update({b:'q'}, {$inc:{a:2}}, false, true)

 

DELETE FROM users WHERE z=”abc”

db.users.remove({z:'abc'});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值