zoukankan      html  css  js  c++  java
  • mongo

    Query failed with error code 2 and error message 'Field 'locale' is invalid in
    
    错误写法 : @Document(collection = "bookEntity")
    
    正确写法一 : @Document("bookEntity")
    
    正确写法二 :
    
      1. 将时间进行转换
      1. 分组求和
      1. 字段显示
    db.mg_order.aggregate({
        $group: {
            _id: {
                date: {
                    "$dateToString": {
                        format: "%Y-%m-%d", date: "$paytime", timezone: "+08:00", onNull: "unspecified",
                    }
                }
                , lotSn: "$parkingLotSn"
            },
            money:{$sum: "$money"}
            ,
            count: { $sum: 1 }
    
        }
    },{
        $project: {date:"$_id_date",count:"$count",money:"$money"}
    })
    

    两次分组

    db.mg_order.aggregate([
        {$group: {"_id": { "lotSn": "$parkingLotSn", "car": "$carPlate" }}},
        {$group: {"_id": { "car":"$_id.car" },count: { $sum: 1 }}
        {$sort: {count:-1}}
     ])
    

    常用分组案例

    db.mg_order.aggregate([
        {
            $group: {
                _id: {
                    date: {
                        "$dateToString": {
                            format: "%Y-%m-%d", date: "$paytime", timezone: "+08:00", onNull: "unspecified",
                        }
                    }
                    , lotSn: "$parkingLotSn"
                },
                money: { $sum: "$money" },
                count: { $sum: 1 }
            }
        },
        {
            $project: { date: "$_id.date", lotSn: "$_id.lotSn", money: "$money", count: "$count", _id: 0 }
        },
        {
            $group: { _id: "$date", lots_ids:{$addToSet: {date:"$date",lotSn:"$lotSn",money:"$money",count:"$count"}}}
        },
        {
            $project: {date:"$_id.date", lots_ids:"$lots_ids"}
        }
    ])
    
    Criteria criteria = Criteria.where("lotSn").in(lotSns).and("statisticTime").gte(start).lte(end);
    MatchOperation match = Aggregation.match(criteria);
    GroupOperation group = Aggregation.group("statisticDate").sum("totalTransactions").as("count")
    				.sum("totalRealIncome").as("money").first("statisticTime").as("time");
    SortOperation sort = Aggregation.sort(Sort.Direction.ASC, "time");
    ProjectionOperation project = Aggregation.project("statisticDate", "count", "money", "time");
    Aggregation aggregation = Aggregation.newAggregation(match, group, project, sort);
    

    andExpression

    ProjectionOperation subPayTime = Aggregation.project("parkingLotSn", "money")
    				.andExpression("{$dateToString:{ format:'%Y-%m-%d',date: '$paytime'}}").as("subPayTime");
    GroupOperation group = Aggregation.group("subPayTime", "parkingLotSn").count().as("count").sum("money")
    				.as("money");
    Aggregation aggregation = Aggregation.newAggregation(match, subPayTime, group);
    

    聚合操作之管道操作与MapReduce

    数据准备

    db.orders.insertMany([
       { _id: 1, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-01"), price: 25, items: [ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" },
       { _id: 2, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-08"), price: 70, items: [ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" },
       { _id: 3, cust_id: "Busby Bee", ord_date: new Date("2020-03-08"), price: 50, items: [ { sku: "oranges", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 4, cust_id: "Busby Bee", ord_date: new Date("2020-03-18"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 5, cust_id: "Busby Bee", ord_date: new Date("2020-03-19"), price: 50, items: [ { sku: "chocolates", qty: 5, price: 10 } ], status: "A"},
       { _id: 6, cust_id: "Cam Elot", ord_date: new Date("2020-03-19"), price: 35, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 7, cust_id: "Cam Elot", ord_date: new Date("2020-03-20"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 8, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 75, items: [ { sku: "chocolates", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 9, cust_id: "Don Quis", ord_date: new Date("2020-03-20"), price: 55, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" },
       { _id: 10, cust_id: "Don Quis", ord_date: new Date("2020-03-23"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }
    ])
    

    使用mapReduce

    var mapFunction1 = function() {
       emit(this.cust_id, this.price);
    };
    
    
    var reduceFunction1 = function(keyCustId, valuesPrices) {
       return Array.sum(valuesPrices);
    };
    
    
    db.orders.mapReduce(
       mapFunction1,
       reduceFunction1,
       { out: "map_reduce_example" }
    )
    
    

    使用管道操作

    // 根据分组将结果输出
    db.orders.aggregate([
       { $group: { _id: "$cust_id", value: { $sum: "$price" } } },
       { $out: "agg_alternative_1" }
    ])
    

    使用mapReduce

    var mapFunction2 = function() {
        for (var idx = 0; idx < this.items.length; idx++) {
               var key = this.items[idx].sku;
           var value = { count: 1, qty: this.items[idx].qty };
    
           emit(key, value);
        }
    };
    
    var reduceFunction2 = function(keySKU, countObjVals) {
       var reducedVal = { count: 0, qty: 0 };
    
       for (var idx = 0; idx < countObjVals.length; idx++) {
           reducedVal.count += countObjVals[idx].count;
           reducedVal.qty += countObjVals[idx].qty;
       }
    
       return reducedVal;
    };
    
    var finalizeFunction2 = function (key, reducedVal) {
      reducedVal.avg = reducedVal.qty/reducedVal.count;
      return reducedVal;
    };
    
    db.orders.mapReduce(
       mapFunction2,
       reduceFunction2,
       {
         out: { merge: "map_reduce_example2" },
         query: { ord_date: { $gte: new Date("2020-03-01") } },
         finalize: finalizeFunction2
       }
     );
    
    

    使用管道

    db.orders.aggregate( [
       { $match: { ord_date: { $gte: new Date("2020-03-01") } } }, // 根据条件进行过滤
       { $unwind: "$items" }, // 将items中的数据进行展开
       { $group: { _id: "$items.sku", qty: { $sum: "$items.qty" }, orders_ids: { $addToSet: "$_id" } }  }, // 根据sku进行分组,计算qty总和,将sku放入集合
       // 数据投影: count,qty,avg=devide/count
       { $project: { value: { count: { $size: "$orders_ids" }, qty: "$qty", avg: { $divide: [ "$qty", { $size: "$orders_ids" } ] } } } },
       // 将上一步的结果存入collection中,如果匹配到进行更新,否则进行插入
       { $merge: { into: "agg_alternative_3", on: "_id", whenMatched: "replace",  whenNotMatched: "insert" } }
    ] )
    
    // $addToSet 将数据放入到set集合中;  $size 统计集合中数据个数
    

    分区间进行统计

    db.mg_parkin.aggregate([
        {$match: {ioType:1}},
        {$addFields: {
            timePart:{$function: {
              body: function(stayTime) {
                 if(stayTime != null){
                     if(stayTime == 1){
                         return "0-0.5h";
                     }else if(stayTime / 2 <= 2){
                         return "1-2h";
                     }else if(stayTime / 2 <= 6){
                         return "2-6h";
                     }else {
                         return "6h以上"
                     }
                 } 
                 return "未知"
              },
              args: [ "$stayTime"],
              lang: "js"
            }}
        }},
        {$group: { _id: "$timePart", count:{$sum: 1}}}
        ])
    
    

    addFields

    一次使用

    AggregationOperation addFields = new AggregationOperation() {
    
        @Override
        public Document toDocument(AggregationOperationContext context) {
            return new Document("$addFields", new Document("name", "$name.am"));
        }
    
    };
    

    泛型

    public AggregationOperation aggregateAddFields(final String field, final String valueExpresion) {
    
        AggregationOperation addFields = new AggregationOperation() {
    
            @Override
            public Document toDocument(AggregationOperationContext context) {
                return new Document("$addFields", new Document(field, valueExpresion));
            }
        };
    
        return addFields;
    }
    ...
    AggregationOperation addFields = aggregateAddFields("name", "$name.am");
    

    导入BSON文件

    mongorestore --host localhost --port 27017 --db dbname --collection collection_name  文件路径
    

    地理位置使用geojson

    mongodb建立地理位置索引出现错误longitude/latitude is out of bound
    解决方法:
    在mongodb中存储GeoJSON的格式是先存经度后存纬度,经度它的范围在±180以内,而维度在±90以内,所以出现这种问题直接找是不是经纬度顺序存储反了即可。(上面的存储顺序是正确的大家不必纠结)

  • 相关阅读:
    Java线程安全和非线程安全
    时间戳获取(周,年,月,日)
    spring+spring 日志输出
    Spring+springMvc+Mybatis
    关于mysql处理百万级以上的数据时如何提高其查询速度的方法
    Tomcat 详解
    理解 $_POST、$_GET 、php://input
    php编译参数注解--不明白许多参数的作用 慎用 –with-curlwrappers参数【转载】
    centos6.5编译安装php[整理一]
    ubuntu16.04 安装chrome 和 phpstorm
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/13721040.html
Copyright © 2011-2022 走看看