MongoDB查询,索引,聚合的命令

MongoDB查询文档

find()
语法:db.collection.find(query, projection)

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键

实例:

> db.tt1.find()
{ "_id" : ObjectId("5e9c2fe4adfddc4273831131"), "name" : "zhang", "age" : 15, "addr" : "beijing" }
{ "_id" : ObjectId("5e9c2fe4adfddc4273831132"), "name" : "lisi", "age" : "18", "addr" : "hebei" }

或使用pretty是文档格式化输出(易读)

> db.tt1.find().pretty()
{
	"_id" : ObjectId("5e9c2fe4adfddc4273831131"),
	"name" : "zhang",
	"age" : 15,
	"addr" : "beijing"
}
{
	"_id" : ObjectId("5e9c2fe4adfddc4273831132"),
	"name" : "lisi",
	"age" : "18",
	"addr" : "hebei"
}

各种查询操作

1.小于 $lt
> db.tt1.find({age:{$lt:18}},{_id:0,})
{ "name" : "zhang", "age" : 15 }
2.小于等于$lte
> db.tt1.find({age:{$lte:18}},{_id:0})
{ "name" : "zhang", "age" : 15 }
{ "name" : "lisi", "age" : 18 }
3.大于$gt
> db.tt1.find({age:{$gt:18}},{_id:0})
{ "name" : "wangwu", "age" : 20 }
4.大于等于$gte
> db.tt1.find({age:{$gte:18}},{_id:0})
{ "name" : "lisi", "age" : 18 }
{ "name" : "wangwu", "age" : 20 }

AND与OR使用方法
当前文档:

> db.tt1.find({},{_id:0})
{ "name" : "zhang", "age" : 15, "addr" : "beijing" }
{ "name" : "lisi", "age" : 18, "addr" : "hebei" }
{ "name" : "wangwu", "age" : 20, "addr" : "tianjing" }
{ "name" : "xx", "age" : 18, "addr" : "beijing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }
##beijing有三人

查询文档内age为18并且addr为beijing的记录

使用and方法
> db.tt1.find({"age":18,"addr":"beijing"},{_id:0})
{ "name" : "xx", "age" : 18, "addr" : "beijing" }

查询文档内age为18或addr为北京的记录

使用or方法
> db.tt1.find({$or:[{"age":18},{"addr":"beijing"}]},{_id:0})
{ "name" : "zhang", "age" : 15, "addr" : "beijing" }
{ "name" : "lisi", "age" : 18, "addr" : "hebei" }
{ "name" : "xx", "age" : 18, "addr" : "beijing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }

查询文档内age大于18并且addr是beijing或tianjin

and,or联合使用
> db.tt1.find({"age":{$gt:18},$or:[{"addr":"tianjing"},{"addr":"beijing"}]},{_id:0})
{ "name" : "wangwu", "age" : 20, "addr" : "tianjing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }

MongoDB索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
语法:db.collection.createIndex(keys, options)
Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
查询语法:db.collection.getindex()
实例

> for (i=1;i<=100000;i++){db.tt2.insert({"name":"a","age":i})}	##创建一个数据量大的文档
> db.tt2.find({"age":999}).explain(true).executionStats.executionTimeMillis
30 		##查询时间为30ms
> db.tt2.createIndex({"age":1}) 		##创建索引
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
> db.tt2.find({"age":999}).explain(true).executionStats.executionTimeMillis
1 ##查询时间为1ms

参数:
1,background: 建索引过程会阻塞其它数据库操作,background可指定以后台方式创
建索引,即增加 “background” 可选参数。 “background” 默认值为
false。
2,unique:建立的索引是否唯一。指定为true创建唯一索引。默认值为false
3,name:索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序
顺序生成一个索引名称。

聚合
MongoDB中聚合的方法使用aggregate()。
实例:
当前文档:

> db.tt1.find({},{_id:0})
{ "name" : "zhang", "age" : 15, "addr" : "beijing" }
{ "name" : "lisi", "age" : 18, "addr" : "hebei" }
{ "name" : "wangwu", "age" : 20, "addr" : "tianjing" }
{ "name" : "xx", "age" : 18, "addr" : "beijing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }

统计addr的数量

> db.tt1.aggregate([{$group:{_id:"$addr",num_add:{$sum:1}}}])
{ "_id" : "beijing", "num_add" : 3 }
{ "_id" : "hebei", "num_add" : 1 }
{ "_id" : "tianjing", "num_add" : 1 }
以字段addr分组,$sum统计总和

聚合管道
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
> db.tt1.aggregate({$project:{_id:0,name:1,age:1,addr:1}})		##为0不输出该字段
为1则输出
{ "name" : "zhang", "age" : 15, "addr" : "beijing" }
{ "name" : "lisi", "age" : 18, "addr" : "hebei" }
{ "name" : "wangwu", "age" : 20, "addr" : "tianjing" }
{ "name" : "xx", "age" : 18, "addr" : "beijing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }


$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
查询文档内addr为beijing的数量:
> db.tt1.aggregate([{$match:{addr:"beijing"}},{$group:{_id:"$addr",sum:{$sum:1}}}])
{ "_id" : "beijing", "sum" : 3 }

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
> db.tt1.aggregate({$skip:3},{$project:{_id:0}})	##跳过前三个文档
{ "name" : "xx", "age" : 18, "addr" : "beijing" }
{ "name" : "cc", "age" : 20, "addr" : "beijing" }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值