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以内,所以出现这种问题直接找是不是经纬度顺序存储反了即可。(上面的存储顺序是正确的大家不必纠结)

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/cfb513142804/p/13721040.html
Copyright © 2011-2022 走看看