高级查询与索引

   > 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使用一个指定的索引,通过这种方法在某些情形下会提升性能。

原文地址:https://www.cnblogs.com/forerver-elf/p/4721557.html