返回集合总数或匹配查询的结果集总数
> db.user.find()
{ "_id" : ObjectId("5a39f91890cf1481126c33e8"), "name" : "test1", "age" : 20 }
{ "_id" : ObjectId("5a39f92290cf1481126c33e9"), "name" : "test1", "age" : 21 }
{ "_id" : ObjectId("5a39f93190cf1481126c33ea"), "name" : "test1", "age" : 22 }
{ "_id" : ObjectId("5a39f9ba90cf1481126c33eb"), "name" : "test1", "address" : [ "ok", "ok", "ok2" ] }
{ "_id" : ObjectId("5a3a07b890cf1481126c33ec"), "name" : "test1", "age" : 32 }
{ "_id" : ObjectId("5a3a07bf90cf1481126c33ed"), "name" : "alen", "age" : 42 }
> db.user.find().count()
6
2. db.collection.distinct()
返回具有指定字段不同值的文档(去除指定字段的重复数据)
db.runCommand()运行一个数据库命令
> db.runCommand({distinct:"user",key:"name"}).values
[ "test1", "alen" ]
>
3.分组
db.collection.group() 提供简单的数据聚合功能
db.collection.group({ key, reduce, initial[, keyf] [, cond] [, finalize] })
key | 作为分组的key |
reduce | 一个聚合函数操作文档的分组操作期间。这些函数可以返回一个sum或count。该函数接受两个参数:当前文档和这个群体聚集的结果文档。 |
initial | 初始化聚合结果文档变量,为空时自动为每列提供初始变量。 |
keyf | 可选。替代的key字段。指定一个函数创建一个“key object”作为分组的key。使用keyf而是通过group by领域而不是现有的文档域键组。 |
cond | 过滤条件 |
finalize | 在db.collection.group()返回最终结果之前,此功能可以修改的结果文档或替换的结果文档作为一个整体。 |
> db.user.find()
{ "_id" : ObjectId("5a39f91890cf1481126c33e8"), "name" : "test1", "age" : 20 }
{ "_id" : ObjectId("5a39f92290cf1481126c33e9"), "name" : "test1", "age" : 21 }
{ "_id" : ObjectId("5a39f93190cf1481126c33ea"), "name" : "test1", "age" : 22 }
{ "_id" : ObjectId("5a39f9ba90cf1481126c33eb"), "name" : "test1", "address" : [ "ok", "ok", "ok2" ] }
{ "_id" : ObjectId("5a3a07b890cf1481126c33ec"), "name" : "test1", "age" : 32 }
{ "_id" : ObjectId("5a3a07bf90cf1481126c33ed"), "name" : "alen", "age" : 42 }
> db.user.group({key:{age:1},initial:{total:0},reduce:function Reduce(doc,out){out.total+=doc.age}})
[
{
"age" : 20,
"total" : 20
},
{
"age" : 21,
"total" : 21
},
{
"age" : 22,
"total" : 22
},
{
"age" : null,
"total" : NaN
},
{
"age" : 32,
"total" : 32
},
{
"age" : 42,
"total" : 42
}
]
>
4.命令执行器runCommand
用命令执行完成一次删除表的操作
db.runCommand({drop:"map"})
{
"nIndexesWas": 2,
"msg" : "indexes dropped forcollection",
"ns" :"foobar.map",
"ok" : 1
}
5.如何查询mongoDB为我们提供的命令
1.在shell中执行db.listCommands()
2.访问网址http://localhost:28017/_commands
6.常用命令举例
1. 查询服务器版本号和主机操作系统
db.runCommand({buildInfo:1})
2. 查询执行集合的详细信息,大小,空间,索引等……
db.runCommand({collStats:"persons"})
3. 查看操作本集合最后一次错误信息
db.runCommand({getLastError:"persons"})
7. 固定集合
固定集合(Capped Collection)是一种尺寸固定的“循环”集合,可提供高效的创建、读取、删除等操作。这里所指“循环”的意思是,当分配给集合的文件尺寸耗尽时,就会自动开始删除最初的文档,不需要提供任何显式的指令。如果文档更新后增加了文档的尺寸,那么固定集合会限制对文档的更新。因为固定集合按照磁盘存储的顺序来保存文档,所以能确保文档尺寸不会增加磁盘分配的尺寸。
固定集合应用场景
比如日志文件,聊天记录,通话信息记录,缓存数据以及任何其他大容量数据等只需保留最近某段时间内的应用场景,都会使用到MongoDB的固定集合。
创建固定集合
要想创建固定集合,需要使用 createCollection 命令,并将 capped 选项设为true,同时还需要指定集合的最大尺寸(以字节计)。
>db.createCollection("cappedLogCollection",{capped:true,size:10000})
除了集合尺寸外,还可以使用 max 参数限制集合中的文档最大数量。
>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
如果想要检查集合是否固定,使用 isCapped 命令即可。
>db.cappedLogCollection.isCapped()
如想将现有集合转化为固定集合,使用下列代码:
>db.runCommand({"convertToCapped":"posts",size:10000})
上述代码会将现有的 posts 集合转化为固定集合。
查询固定集合
默认情况下,利用 find 查询固定集合,结果会按照插入顺序进行显示。但如果想按相反顺序获取文档,可以使用 sort 命令,如下所示:
>db.cappedLogCollection.find().sort({$natural:-1})
关于固定集合,有以下几个非常值得注意的要点:
- 无法从固定集合中删除文档。
- 固定集合没有默认索引,甚至在 _id 字段中也没有。
- 在插入新的文档时,MongoDB 并不需要寻找磁盘空间来容纳新文档。它只是盲目地将新文档插入到集合末尾。这使得固定集合中的插入操作是非常快速的。
- 同样的,在读取文档时,MongoDB 会按照插入磁盘的顺序来读取文档,从而使读取操作也非常快
> db.createCollection("cappedLogCollecton",{capped:true,size:10000})
{ "ok" : 1 }
> db.createCollection("testCol",{capped:true,size:10000,max:1000})
{ "ok" : 1 }
> db.testCol.isCapped()
true
> db.testCol.insert({name:"alen",phone:"123456"})
WriteResult({ "nInserted" : 1 })
> db.testCol.insert({name:"alen",phone:"123456"})
WriteResult({ "nInserted" : 1 })
> db.testCol.insert({name:"alen",phone:"98989"})
WriteResult({ "nInserted" : 1 })
> db.testCol.insert({name:"test",phone:"98989"})
WriteResult({ "nInserted" : 1 })
> db.testCol.find()
{ "_id" : ObjectId("5a3b21e35e9985cded2a0752"), "name" : "alen", "phone" : "123456" }
{ "_id" : ObjectId("5a3b21e65e9985cded2a0753"), "name" : "alen", "phone" : "123456" }
{ "_id" : ObjectId("5a3b21ee5e9985cded2a0754"), "name" : "alen", "phone" : "98989" }
{ "_id" : ObjectId("5a3b21fa5e9985cded2a0755"), "name" : "test", "phone" : "98989" }
> db.user.isCapped()
false
> db.testCol.find().sort({$natural:-1})
{ "_id" : ObjectId("5a3b21fa5e9985cded2a0755"), "name" : "test", "phone" : "98989" }
{ "_id" : ObjectId("5a3b21ee5e9985cded2a0754"), "name" : "alen", "phone" : "98989" }
{ "_id" : ObjectId("5a3b21e65e9985cded2a0753"), "name" : "alen", "phone" : "123456" }
{ "_id" : ObjectId("5a3b21e35e9985cded2a0752"), "name" : "alen", "phone" : "123456" }
> db.testCol.find()
{ "_id" : ObjectId("5a3b21e35e9985cded2a0752"), "name" : "alen", "phone" : "123456" }
{ "_id" : ObjectId("5a3b21e65e9985cded2a0753"), "name" : "alen", "phone" : "123456" }
{ "_id" : ObjectId("5a3b21ee5e9985cded2a0754"), "name" : "alen", "phone" : "98989" }
{ "_id" : ObjectId("5a3b21fa5e9985cded2a0755"), "name" : "test", "phone" : "98989" }
>
参考:
http://www.mongodb.org.cn/manual/Collection/
http://wiki.jikexueyuan.com/project/mongodb/mongodb-capped-collections.html