Fork me on GitHub
Suzf  Blog

Tag MongoDB

MongoDB 基本查询

MongoDB 基本查询

数据库版本
> db.version()
3.0.6

1. show dbs
查看当前主机的所有数据库

db
查看当前所使用的数据库

show collections
查看当前数据库的 collection == show tables

** 如何查看帮助 **
> help

如果想知道当前数据库支持哪些方法
> db.help();

如果想知道当前数据库下的表或者表collection支持哪些方法,可以使用一下命令如:
> db.user.help(); user为表名

2. use cherry
切换数据库, 如果数据库不存在则新创建数据库[ 隐示创建数据库 ]

3. db.user.save({"name":"jack", age:21, "sex":"male"});
user这个表也会隐式的被创建,并且插入一条文档 ,文档有name,age,sex。下面我们在用另外一种方法插入一条数据。

删除表
> db.user.drop();
True

4. db.user.insert({"name":"tom", age:19, "sex":"male"});
在user中插入数据,可能你会问insert和save有什么不同,他们还真的有点不同!
insert仅仅是插入文档到集合中,如果记录不存在则插入,如果记录存在则忽略

** save是在文档不存在时插入,存在时则是更新 **

5. db.user.find();
这个可以查询user集合中所有的数据。所有的文档都有_Id这一列,这个是主键,是系统生成唯一的主键,不过我们也可以自己来操作,不过自己操作的时候可千万不能有重复的值,要不会有异常。

6. db.user.findOne();
这个查询user集合中最上面一条数据并显示。

7. db.user.find({name:"jack"});
查询name是jack的文档。

8. db.user.update({name:"tom"}, {$set:{name:"Jim"}});
修改名称tom为Jim,这个是修改的方法。

9. db.user.remove({name:"Jim"});
这个是删除name为Jim!
这些都是最最基本的增删改查了,下面将重点讲解查询!

10. 条件操作符< 、<=、>、>=
db.user.find({age:{$gt:20}});
查询年龄大于12岁的用户,如此的还有$lt小于、$gte大于等于、$lte小于等于。

11. $all匹配所有
db.user.find({age:{$all:[21]}});
他会匹配所有age等于21的文档。

12. $exists判断字段是否存在
db.user.find({age:{$exists:true}});
查询所有存在age字段的文档。false表示不存在。

13. $mod取模运算
db.user.find({age:{$mod:[10, 1]}});
查询所有age模10等于1的文档。

14. $ne不等于
db.user.find({age: {$ne : 20}});
查询所有年龄不等于20的用户文档。

15. $in包含
db.user.find({age : { $in : [20, 21, 22]}});
查询所有年龄等于20、21、22的用户文档。

16. $nin不包含
db.user.find({age : {$nin : [20, 21, 22]}});
查询所有年龄不等于20、21、22的用户文档。

17. count查询记录条数
db.user.find().count();
返回cherry集合中文档记录的数目。

18. limit限制显示的条数
db.user.find().limit(5);
返回cherry中上面的5条记录。

19. skip限制返回记录的起点
db.user.find().skip(3);
返回cherry中上面数第三条数据一下的所有数据

20. 分页的实现
db.user.find().skip(1).limit(5);
返回从第二条数据开始,显示5条数据,这个可以用作分页,很简单就实现了!

21. sort排序
db.user.find().sort({age:1});
所有的数据按年龄大小升序(asc)排列,既然1表示asc排列,那么-1就表示desc排列,这是真的。

22. distinct去掉重复值
db.user.find().distinct("name");
按name的重复值筛选数据。

根据条件查找数据
-----------------------
通过条件查询: db.foo.find( { x : 77 } , { name : 1 , x : 1 } )
-----------------------------
db.foo.find(...).count()
db.foo.find(...).limit(n) 根据条件查找数据并返回指定记录数
db.foo.find(...).skip(n)
db.foo.find(...).sort(...) 查找排序
db.foo.findOne([query]) 根据条件查询只查询一条数据
db.foo.getDB() get DB object associated with collection 返回表所属的库
db.foo.getIndexes() 显示表的所有索引
db.foo.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) 根据条件分组
db.foo.mapReduce( mapFunction , reduceFunction , )
db.foo.remove(query) 根据条件删除数据
db.foo.renameCollection( newName ) renames the collection 重命名表
db.foo.save(obj) 保存数据
db.foo.stats() 查看表的状态
db.foo.storageSize() - includes free space allocated to this collection 查询分配到表空间大小
db.foo.totalIndexSize() - size in bytes of all the indexes 查询所有索引的大小
db.foo.totalSize() - storage allocated for all data and indexes 查询表的总大小
db.foo.update(query, object[, upsert_bool]) 根据条件更新数据
db.foo.validate() - SLOW 验证表的详细信息
db.foo.getShardVersion() - only for use with sharding

1. 超级用户相关:

#增加或修改用户密码

db.addUser('admin','pwd')

#查看用户列表

db.system.users.find()

#用户认证

db.auth('admin','pwd')

#删除用户

db.removeUser('mongodb')

#查看所有用户

show users

#查看所有数据库

show dbs

#查看所有的collection

show collections

#查看各collection的状态

db.printCollectionStats()

#查看主从复制状态

db.printReplicationInfo()

#修复数据库

db.repairDatabase()

#设置记录profiling,0=off 1=slow 2=all

db.setProfilingLevel(1)

#查看profiling

show profile

#拷贝数据库

db.copyDatabase('mail_addr','mail_addr_tmp')

#删除collection

db.mail_addr.drop()

#删除当前的数据库

db.dropDatabase()

2. 客户端连接

/usr/local/mongodb/bin/mongo user_addr -u user -p 'pwd'

3. 增删改

#存储嵌套的对象

db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

#存储数组对象

db.user_addr.save({'Uid':'[email protected]','Al':['[email protected]','[email protected]']})

#根据query条件修改,如果不存在则插入,允许修改多条记录

db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)

#删除yy=5的记录

db.foo.remove({'yy':5})

#删除所有的记录

db.foo.remove()

4. 索引

增加索引:1(ascending),-1(descending)

db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

#索引子对象

db.user_addr.ensureIndex({'Al.Em': 1})

#查看索引信息

db.deliver_status.getIndexes()

db.deliver_status.getIndexKeys()

#根据索引名删除索引

db.user_addr.dropIndex('Al.Em_1')

5. 查询

查找所有

db.foo.find()

#查找一条记录

db.foo.findOne()

#根据条件检索10条记录

db.foo.find({'msg':'Hello 1'}).limit(10)

#sort排序

db.deliver_status.find({'From':'[email protected]'}).sort({'Dt',-1})

db.deliver_status.find().sort({'Ct':-1}).limit(1)

#count操作

db.user_addr.count()

#distinct操作

db.foo.distinct('msg')

#>操作

db.foo.find({"timestamp": {"$gte" : 2}})

#子对象的查找

db.foo.find({'address.city':'beijing'})

6. 管理

查看collection数据的大小

db.deliver_status.dataSize()

#查看colleciont状态

db.deliver_status.stats()

#查询所有索引的大小

db.deliver_status.totalIndexSize()

 

MongoDB 数据备份与还原

mongodb数据备份和还原主要分为二种:
一种是针对于库的mongodump和mongorestore
一种是针对库中表的mongoexport和mongoimport

一. mongodump备份数据库

1. 常用命令格

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径

如果没有用户谁,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。

2. 导出所有数据库

#mongodump -h 127.0.0.1 -o /home/zfsu/mongodb/
2015-10-13T16:00:46.585+0800    writing cherry.counters to /home/zfsu/mongodb/cherry/counters.bson
2015-10-13T16:00:46.586+0800    writing cherry.counters metadata to /home/zfsu/mongodb/cherry/counters.metadata.json
2015-10-13T16:00:46.588+0800    done dumping cherry.counters (1 document)
2015-10-13T16:00:46.588+0800    writing cherry.reports to /home/zfsu/mongodb/cherry/reports.bson
2015-10-13T16:00:46.644+0800    writing cherry.reports metadata to /home/zfsu/mongodb/cherry/reports.metadata.json
2015-10-13T16:00:46.645+0800    done dumping cherry.reports (7934 documents)
... ...

3. 导出指定数据库

#mongodump -h 127.0.0.1 -d cherry -o /home/zfsu/mongodb/
2015-10-13T16:03:42.508+0800    writing cherry.counters to /home/zfsu/mongodb/cherry/counters.bson
2015-10-13T16:03:42.509+0800    writing cherry.counters metadata to /home/zfsu/mongodb/cherry/counters.metadata.json
2015-10-13T16:03:42.510+0800    done dumping cherry.counters (1 document)
2015-10-13T16:03:42.510+0800    writing cherry.reports to /home/zfsu/mongodb/cherry/reports.bson
2015-10-13T16:03:42.550+0800    writing cherry.reports metadata to /home/zfsu/mongodb/cherry/reports.metadata.json
2015-10-13T16:03:42.550+0800    done dumping cherry.reports (7934 documents)
2015-10-13T16:03:42.550+0800    writing cherry.system.indexes to /home/zfsu/mongodb/cherry/system.indexes.bson
2015-10-13T16:03:42.552+0800    writing cherry.users to /home/zfsu/mongodb/cherry/users.bson
2015-10-13T16:03:42.553+0800    writing cherry.users metadata to /home/zfsu/mongodb/cherry/users.metadata.json
2015-10-13T16:03:42.554+0800    done dumping cherry.users (35 documents)

二. mongorestore还原数据库

1. 常用命令格式
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径
--drop的意思是,先删除所有的记录,然后恢复。

2. 恢复所有数据库到mongodb中
# mongorestore /home/zfsu/mongodb/   #这里的路径是所有库的备份路径

3. 还原指定的数据库
# mongorestore -d cherry /home/zfsu/mongodb/cherry/           #cherry这个数据库的备份路径

# mongorestore -d cherry_new  /home/zfsu/mongodb/cherry/      #将cherry还有cherry_new数据库中

这二个命令,可以实现数据库的备份与还原,文件格式是json和bson的。无法指写到表备份或者还原。

三. mongoexport导出表,或者表中部分字段
1. 常用命令格式
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名

上面的参数好理解,重点说一下:

-f    导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q    可以根查询条件导出,-q '{ "uid" : "100" }' 导出uid为100的数据
--csv 表示导出的文件格式为csv的,这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点

2. 导出整张表

# mongoexport -d cherry -c users -o /home/zfsu/mongodb/cherry/users.data
2015-10-13T16:19:53.048+0800    connected to: localhost
2015-10-13T16:19:53.074+0800    exported 35 records

3. 导出表中部分字段

# mongoexport -d cherry -c reports --csv -f date,tags -o /home/zfsu/mongodb/cherry/reports.csv
2015-10-13T16:23:15.269+0800    csv flag is deprecated; please use --type=csv instead
2015-10-13T16:23:15.276+0800    connected to: localhost
2015-10-13T16:23:15.477+0800    exported 7934 records

4. 根据条件导出数据

# mongoexport -d cherry -c reports -q '{time_cost:{$gt:1}}' -o /home/zfsu/mongodb/cherry/reports.json
2015-10-13T16:25:54.162+0800    connected to: localhost
2015-10-13T16:25:54.585+0800    exported 7920 records

四. mongoimport导入表,或者表中部分字段

1. 常用命令格式

1.1. 还原整表导出的非csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名
重点说一下--upsert,其他参数上面的命令已有提到,--upsert 插入或者更新现有数据

1.2. 还原部分字段的导出文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields根--upsert一样

1.3. 还原导出的csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名

上面三种情况,还可以有其他排列组合的。

2. 还原导出的表数据

# mongoimport -d cherry -c users --upsert /home/zfsu/mongodb/cherry/users.data

3. 部分字段的表数据导入

# mongoimport -d cherry -c reports  --upsertFields date,tags -o /home/zfsu/mongodb/cherry/users.data

4. 还原csv文件

# mongoimport -d cherry -c reports --type csv --headerline --file /home/zfsu/mongodb/cherry/reports.csv

 

How-to: install mongo and php support

MongoDB可以从开放源代码来建构与安装,更常见的是安装binary文件,目前有Windows, Linux, OS XSolaris版本。许多Linux包管理系统现在已包含了MongoDB的包,包括CentOSFedora,[1] DebianUbuntu,[2] Gentoo[3]以及Arch Linux[4] 同样可从官方网站获取。[5]

MongoDB使用内存映射文件, 32位系统上限制大小为2GB的数据 (64-比特支持更大的数据).[6] MongoDB服务器只能用在小端序系统,虽然大部分公司会同时准备小端序和大端序系统。