> sudo service mongodb start
> mongo
> exit #退出mongodb
覆盖索引查询
所有的查尊字段都是索引的一部分,所有的查询返回字段在同一个索引中。由于索引存在RAM中,因为索引获取数据要比扫描文档快。
> db.users.ensureIndex({gender:1,user_name:1})
> db.users.find({gender:"M"},{user_name:1,_id:0}) #这次查询,Mongodb不会在数据库文件中查找,而会从索引中提取数据。因为所以中不包含字段_id,所以_id在查询中会默认返回,可以在查询结果中将其排除。
高级索引
索引数组字段。在数组中创建索引,需要对数组中的每个字段一次建立索引。
> db.user.insert({"adress":{"city":"zhuhai","province":"guangdong","pincode":"123"},"tags":["music","cricket","blogs"],"name":"clound"})
> db.user.ensureIndex({"tags":1}) #会为music,cricket,blogs三个值建立单独的索引
> db.user.find({tags:"cricket"})
> db.user.find({tag:"cricket"}).explain() #验证索引是否被使用 若执行结果中显示"cursor":"BtreeCursor tags_1"则表示已经使用了索引
> db.user.ensureIndex({"address.city":1,"address.provice":1,"address.pincode":1})
> db.user.find({"address.city":"chengdu"})
> db.user.find({"address.city":"chengdu","address.province":"sichuan"}) #查询表达式必须遵循指定的索引的顺序
原子操作
原子操作就是要么执行成功,要么执行失败。
$set 用来指定一个键并更新键值,若键不存在并创建
$unset 用来删除一个键
$inc 对文档的某个值为数字型的键进行增减
$push 把value追加到field里面去,field一定要是数组类型才行,若field不存在,会把一个数组类型加进去
$pushAll 一次追加多个值到一个数组字段内
$pull 从数组field内删除一个等于value的值
$addToSet 增加一个值到数组内,而且只有这个值不在数组内才增加
$pop 删除数组的一个或最后一个元素
$rename 修改字段名称
$bit 位操作,integer类型
查询分析
explain操作提供了查询信息,使用索引及查询统计等。indexOnly若为true,表示我们使用了索引;cursor因为使用了索引,MongoDB中索引存储在B树结构中,若没有使用索引,有表的类型是BasicCursor。这个键还会给出使用的索引的名称,可以通过这个名称查询当前数据库下的system.indexes集合来得到索引的详细信息;n当前查询返回的文档数量;nscanned/nscannedObjects表明当前只一次查询一共扫描了集合中多少个文档;millis当前查询所需时间,毫秒数;indexBounds当前查询具体使用的索引
hint():可以使用hints强迫Mongodb使用一个指定的索引,通过这种方法在某些情形下会提升性能。