Как использовать «$ dateToString» в критериях MongoQuery (Spring Boot) - PullRequest
0 голосов
/ 28 мая 2018

я использую SpringBoot (v1.5.10), SpringData и MongoDb;

db.login.aggregate(
[
    { 
        "$match" : {
            "user._id" : NumberLong(204)
        }
    }, 
    { 
        "$group" : {
            "_id" : {
               "datetime" : { $dateToString: { format: "%d-%m-%Y", date: "$datetime"}}, 
                "ip" : "$ip",


            },
             count: { $sum: 1 }   
        }
    }

]);
  • 2011-01-10 count 5
  • 2011-01-16 count16

        Criteria criteria = Criteria.where("user._id").is(paramuserid).andOperator(
            Criteria.where("datetime").gte(paramfirstdate),
            Criteria.where("datetime").lt(paramseconddate)
                    );
    AggregationOperation match = Aggregation.match(criteria);   
    
    List<AggregationOperation> aggregationoperations = new ArrayList <AggregationOperation>();  
    aggregationoperations.add(match);
    aggregationoperations.add(Aggregation.group("datetime"));  
    AggregationResults<?> aggregationresults = this.mngT.aggregate(Aggregation.newAggregation(aggregationoperations), Login.class, Object.class);
    
  • 2011-01-10 09:00:01 количество 1

  • 2011-01-10 09:15:00количество 1

Монго агрегатная дата / время без «времени», я пытаюсь подобный критерий запроса не работает, потому что группа с частью времени.Как использовать $ dateToString в критериях запроса

1 Ответ

0 голосов
/ 28 мая 2018

Я решил.

Criteria criteria = Criteria.where("user._id").is(paramuserid).andOperator(
            Criteria.where("datetime").gte(paramfirstdate),
            Criteria.where("datetime").lt(paramseconddate)
                    );
    AggregationOperation match = Aggregation.match(criteria);   

    List<AggregationOperation> aggregationoperations = new ArrayList <AggregationOperation>();  
    aggregationoperations.add(match);
    aggregationoperations.add(Aggregation.project("ip","datetime").andExpression("datetime").dateAsFormattedString("%d-%m-%Y").as("formateddate"));
    aggregationoperations.add(Aggregation.group("ip","formateddate").count().as("TOT"));
    AggregationResults<?> aggregationresults = this.mngT.aggregate(Aggregation.newAggregation(aggregationoperations), Login.class, Object.class);
...