MongoDB 查询

 null数据类型的查询:
    --在进行值为null数据的查询时,所有值为null,以及不包含指定键的文档均会被检索出来。
    > db.test.find({"x":null})
    { "_id" : ObjectId("4fd59d30b9ac507e96276f1b"), "x" : null }
    { "_id" : ObjectId("4fd59d49b9ac507e96276f1c"), "y" : 1 }
 
    --需要将null作为数组中的一个元素进行相等性判断,即便这个数组中只有一个元素。
    --再有就是通过$exists判断指定键是否存在。

    > db.test.find({"x": {"$in": [null], "$exists":true}})
    { "_id" : ObjectId("4fd59d30b9ac507e96276f1b"), "x" : null }

数组查询,查询国家数组中有中国的电影

查询tags数组中,至少有一个元素满足count大于一万且name为动漫的电影

检索数组中需要包含多个元素的情况,这里使用$all。出现顺序无关紧要

下面的示例表示精确匹配,即被检索出来的文档,数组数据必须和查询条件完全匹配,即不能多,也不能少,顺序也必须保持一致。

匹配数组中指定下标元素的值。数组的起始下标是0。

通过$size获取数组的长度,但是$size不能和比较操作符联合使用。如果需要查找数组长度在一定范围,可以增加一个字段或者使用函数

使用forEach,花费时间比较长

通过$slice返回数组中的部分数据。"$slice":2表示数组中的前两个元素。

通过$slice返回数组中的部分数据。"$slice":-2表示数组中的后两个元素。

$slice : [2,1],表示从第二个2元素开始取1个,如果获取数量大于2后面的元素数量,则取后面的全部数据

嵌套查询,并且返回字段为指定字段,指定显示或者不显示的字段,不能混合使用1和0

当嵌入式文档为数组时,需要$elemMatch操作符来帮助定位某一个元素匹配的情况,否则嵌入式文件将进行全部的匹配。
即检索时需要将所有元素都列出来作为查询条件方可。

    > db.test.findOne()
    {
         "_id" : ObjectId("4fd5af76b9ac507e96276f23"),
         "comments" : [
                 {
                         "author" : "joe",
                         "score" : 3
                 },
                 {
                         "author" : "mary",
                         "score" : 6
                 }
         ]
    }
    > db.test.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}
    { "_id" : ObjectId("4fd5af76b9ac507e96276f23"), "comments" : [ { "author" : "joe", "score" : 3 }, { "author" : "mary", "score" : 6 } ] }
 

查找高分电影

统计各个分段电影数目,并重命名字段

查询最高分和最低分

类型转换,NumberLong 对字符串格式有要求,不能有小数点

mapReduce

db.collection.mapReduce(
   function() {emit(key,value);},  //map 函数
   function(key,values) {return reduceFunction},   //reduce 函数
   {
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。

Map 函数必须调用 emit(key, value) 返回键值对。

参数说明:

  • map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
  • reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。
  • out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  • query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)

将8分以上的电影统计下,求出数目,保存到tmp表中,查看结果

这种方法比使用group慢太多了。。。

            (1)MapReduce使用自定义JavaScript函数执行map和reduce操作,所以是基于js引擎,单线程执行,效率不高,比Aggregation复杂,适合用做后台统计等。
            (2)MapReduce支持分片操作,可以进行拆分,分发到不同的机器上执行(多服务器并行做数据集合处理),然后再将不同的机器处理的结果汇集起 来,输出结果,。
            (3)MapReduce能执行单一聚合的所有操作count、distinct、group,但group 在当数据量非常大的时候,处理能力就不太好,先筛选再分组,不支持 分片,对数据量有所限制,效率不高。

单关键字模糊查询,正则表达式使用

查询结果使用 forEach函数处理,更加灵活

使用聚合函数达到类似的效果,并且速度更快

修改字段类型,整个文档的修改花费时间较长,

也可以使用 update,会稍微提高一点效率

猜你喜欢

转载自my.oschina.net/ahaoboy/blog/1621694