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" }