zoukankan      html  css  js  c++  java
  • mongoTemplate学习笔记

    mongoTemplate的andExpression表达式

    Aggregation<Post> agg = Aggregation.newAggregation(
                Record.class,
                match(Criteria.where("createAt").gte(startAt).lte(endAt)),
                project().andExpression("{$dateToString:{format:'%Y-%m-%d',date: {$add:{'$createAt',8*60*60000}}}}").as("createAt")
                ,group( "createAt").count().as("totalNum")
                ,sort(Sort.Direction.DESC, "createAt")
            );
     AggregationResults<BasicDBObject> result = mongoTemplate.aggregate(agg, BasicDBObject.class);
     List<BasicDBObject> results = result.getMappedResults();

    mongoTemplate中的project()的用法,和previousOperation()的用法

    https://blog.csdn.net/hotdust/article/details/52605990

    最近使用Spring-Data-Mongodb的API来改写原来的代码,遇到了一些问题,先把自己学到的一些东西总结下来。

    参考:

    http://www.cnblogs.com/ontheroad_lee/p/3756247.html  (这个文章特别好,很少有中文的关于Spring-Data-Mongodb的API的例子的介绍)

    http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation.examples.example6 (官方文档)

     

    1,project("name", "netPrice")

        project方法的内容是你要映射的字段,相当于{$project: {sumfavour: 1, userid: 1}}。“映射”的意思,就是要显示哪个字段,或者把某个字段内容进行处理后显示。

    2,project().and("foo").as("bar")

        如果你想要把一个字段映射成别一个名字的话,就可以用上面的方法,相当于{$project: {bar: $foo}}

    3,project("a","b").and("foo").as("bar") 

        这个方法相当于上面两个方法的结合{$project: {a: 1, b: 1, bar: $foo}}。如果单独使用and(),后面不使用as()的话,没有任何效果,也不会出错。

    4,project().and("_id").plus(100000000).as("statusid")

        这个语句的意思是,把_id字段加上100000000,再重新命名为"statusid"然后输出。

    5,关于previousOperation()方法

    Aggregation agg = newAggregation(
        project("tags"),
        unwind("tags"),
        group("tags").count().as("n"),
        project("n").and("tag").previousOperation(),
        sort(DESC, "n")

    );

        这段代码中主要讲的是previousOperation()方法的使用,想知道其它语句的含义,请参考官网文章介绍。说previousOperation之前要先说说Group语句,这里的Group语句的作用是,按“tags”字段进行分组,然后统计每个分组中的数据个数,统计的个数字段命名为“n”。输出的结果为(这里只为粘贴了所有数据中的一条):

        "_id" : "627",

       "n" : NumberInt(16)
    }

    project语句的作用是,把新生成的字段”n“做为结果输出,并且”_id“列重新命名为”tag“,然后也做为结果输出,最后结果为:

     

        "tag" : "627",

       "n" : NumberInt(16)
    }

    看完结果后,我们来说一下previousOperation()的作用。previousOperation()就是把“上一次操作的结果中”的_id字段,命名为它前面and()中的名称。所以它一般都是和and()结合使用。关于Group操作后,_id的内容的介绍,请看最下面的“关于_id字段”说明。

    6,

     

    1.  
      TypedAggregation<ZipInfo> aggregation = newAggregation(ZipInfo.class,
    2.  
      group("state","city")
    3.  
      .sum("population").as("pop"),
    4.  
      sort(ASC,"pop","state","city"),
    5.  
      group("state")
    6.  
      .last("city").as("biggestCity")
    7.  
      .last("pop").as("biggestPop")
    8.  
      .first("city").as("smallestCity")
    9.  
      .first("pop").as("smallestPop"),
    10.  
      project()
    11.  
      .and("state").previousOperation()
    12.  
      .and("biggestCity")
    13.  
      .nested(bind("name","biggestCity").and("population","biggestPop"))
    14.  
      .and("smallestCity")
    15.  
      .nested(bind("name","smallestCity").and("population","smallestPop")),
    16.  
      sort(ASC,"state")
    17.  
      );

    通过nested()方法,可以把输出的结果变成嵌套格式,例如:

     

        "object":{ "fieldA":"valueA","fieldB":"valueB"}

    bind()方法是用通过已经存在的字段,来生成新的字段。例如

        and("biggestCity").nested(bind("newField", "existField"))

    7,

     

    1.  
      TypedAggregation<Product> agg = newAggregation(Product.class,
    2.  
      project("name","netPrice")
    3.  
      .and("netPrice").plus(1).as("netPricePlus1")
    4.  
      .and("netPrice").minus(1).as("netPriceMinus1")
    5.  
      .and("netPrice").multiply(1.19).as("grossPrice")
    6.  
      .and("netPrice").divide(2).as("netPriceDiv2")
    7.  
      .and("spaceUnits").mod(2).as("spaceUnitsMod2")
    8.  
      );

    可以在映射完某个字段后,还可以对字段进行加减乘除。

     

    8,

     

    1.  
      TypedAggregation<Product> agg = newAggregation(Product.class,
    2.  
      project("name","netPrice")
    3.  
      .andExpression("netPrice + 1").as("netPricePlus1")
    4.  
      .andExpression("netPrice - 1").as("netPriceMinus1")
    5.  
      .andExpression("netPrice / 2").as("netPriceDiv2")
    6.  
      .andExpression("netPrice * 1.19").as("grossPrice")
    7.  
      .andExpression("spaceUnits % 2").as("spaceUnitsMod2")
    8.  
      .andExpression("(netPrice * 0.8 + 1.2) * 1.19").as("grossPriceIncludingDiscountAndCharge")
    9.  
       
    10.  
      );

    还可以用andExpression()方法,使用一些mongo中的函数,例如:substr等。更重要的一点,还可以使用SpringSpEL表达式。上面的例子就是使用了表达式。下面是使用和不使用表达式的例子:

     

    使用表达式:

     

      1+(q +1)/(q -1)

    不使用表达式:

     

     

    1.  
      {"$add":[1,{
    2.  
      "$divide":[{
    3.  
      "$add":["$q",1]},{
    4.  
      "$subtract":["$q",1]}
    5.  
      ]
    6.  
      }]}

     

    而且,而且,在表达式内部还可以设置用外部变量进行替换。

     

    1.  
      TypedAggregation<Product> agg = newAggregation(Product.class,
    2.  
      project("name","netPrice")
    3.  
      .andExpression("(netPrice * (1-discountRate) + [0]) * (1+taxRate)", shippingCosts).as("salesPrice")
    4.  
      );

    [0]的位置,就会被后面的shippingCosts参数的内容给替换。

     

     

     

     

    关于_id字段

        _id字段是插入到数据库时自动生成的。在使用Group等聚合操作后,_id的内容会随着变化。例如:

    1,{$group:{_id:'$statusid', sumfavour:{$sum:1}}}

    这个语句的意思是,按照statusid字段进行分组,并统计每个分组的数据个数,被统计的个数字段命名为“sumfavour”。

    从下面的输出的内容可以看到,_id内容就是statusid字段的内容。


        "sumfavour" : NumberInt(16), 
        "statusid" : "627"
    }

     

    2,{$group:{_id:{'statusid':'$statusid','userid':'$userid'}, sumfavour:{$sum:1}}}

    这个语句的意思是按两个字段的内容进行排序。当以两个或以上的字段进行分组时,必须这么写,下面的例子都是错误的:

    X:$group:{_id:{'$statusid','$userid'}}

    X:$group:{_id:{'statusid','userid'}}

    从这次分组完后的内容可以看到,_id的内容是statusid和userid两个字段的内容的组合。


        "_id" : {
            "statusid" : NumberInt(538), 
            "userid" : NumberInt(416347)
        }, 
        "sumfavour" : NumberInt(1)
    }

    可以看出_id字段

  • 相关阅读:
    栈的实现
    函数传值 传地址 传引用的区别【转】
    sql server数据库最大Id冲突问题解决方法之一
    c#3.5关于JSON简单操作的实用帮助类(泛型实现)
    OLLYDBG
    SocketException.ErrorCode 列表及注释,Winsocket Error 列表及注释
    Netbeans5.5.1 连接 Mysql
    大型互联网网站架构心得之一:任务拆分
    工作流(WF)中使用SqlWorkflowPersistenceService创建完全的持久性服务
    Windows Phone学习笔记
  • 原文地址:https://www.cnblogs.com/tangzhe/p/9563817.html
Copyright © 2011-2022 走看看