3

Монго:Spring Data Монго Шаблон - Подсчет документа массива

{ 
    "_id" : "1", 
    "array" : [ 
     { 
      "item" : "item" 
     }, 
     { 
      "item" : "item" 
     } 
    ] 
} 

Мои mongo shell query выглядит так:

db.getCollection('collectionName').aggregate(
    {$match: { _id: "1"}}, 
    {$project: { count: { $size:"$array" }}} 
) 

Есть ли вообще осуществить это с помощью Mongo Template from Spring?

До сих пор у меня есть это:

MatchOperation match = new MatchOperation(Criteria.where("_id").is("1")); 
ProjectionOperation project = new ProjectionOperation(); 
Aggregation aggregate = Aggregation.newAggregation(match, project); 
mongoTemplate.aggregate(aggregate, collectionName, Integer.class); 

Я думаю, что я только хватает project логики, но я не уверен, если это возможно сделать $size or equivalent здесь.

ответ

3

Это вполне возможно, оператор $size поддерживается (см DATAMONGO-979 и ее реализации here). Ваша реализация может последовать этому примеру:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 

Aggregation agg = newAggregation(
    match(where("_id").is("1")), // 
    project() // 
     .and("array") // 
     .size() // 
     .as("count") 
); 

AggregationResults<IntegerCount> results = mongoTemplate.aggregate(
    agg, collectionName, Integer.class 
); 
List<IntegerCount> intCount = results.getMappedResults(); 
+0

Вот где "теперь Criteria.where (...) – dragonalvaro

0

Вы можете написать запрос в

Aggregation aggregate = Aggregation.newAggregation(Aggregation.match(Criteria.where("_id").is(1)), 
      Aggregation.project().and("array").size().as("count")); mongoTemplate.aggregate(aggregate, collectionName, Integer.class); 

Он выполнит следующий запрос { "aggregate" : "collectionName" , "pipeline" : [ { "$match" : { "_id" : 1}} , { "$project" : { "count" : { "$size" : [ "$array"]}}}]}

0

Пожалуйста, найдите ниже образец кода. Вы можете соответствующим образом изменить его для своего требования с именем коллекции, классом имени коллекции и именем поля массива. Выход

MatchOperation match = new MatchOperation(Criteria.where("_id").is("1")); 
    Aggregation aggregate = Aggregation.newAggregation(match, Aggregation.project().and("array").project("size").as("count")); 

    AggregationResults<CollectionNameClass> aggregateResult = mongoOperations.aggregate(aggregate, "collectionName", <CollectionNameClass>.class); 

    if (aggregateResult!=null) { 
     //You can find the "count" as an attrribute inside "result" key 
     System.out.println("Output ====>" + aggregateResult.getRawResults().get("result")); 
     System.out.println("Output ====>" + aggregateResult.getRawResults().toMap()); 
    } 

Пример: -

Output ====>[ { "_id" : "3ea8e671-1e64-4cde-bd78-5980049a772b" , "count" : 47}] 
Output ====>{serverUsed=127.0.0.1:27017, waitedMS=0, result=[ { "_id" : "3ea8e671-1e64-4cde-bd78-5980049a772b" , "count" : 47}], ok=1.0} 
Смежные вопросы