2017-01-25 12 views
0

Я пытаюсь извлечь элемент из массива в MongoDB в моем проекте Spring Framework.Фильтровать массив в поле поддокументного массива в Spring framework

Я нашел решение для оболочки MongoDB, но я не знаю, как реализовать его Spring.data.core.aggregation, один из операторов агрегации @addFields не поддерживается Spring.

Может ли кто-нибудь сказать мне, как заменить этот @addField или каким образом реализовать в нем другой способ? Огромное спасибо!!!

MongoDB выборочные данные:

{ 
    "_id" : 15, 
    "items" : [ 
      { 
        "columns" : [ 
          { 
            "title" : "hhh", 
            "value" : 10 
          }, 
          { 
            "title" : "hahaha", 
            "value" : 20 
          } 
        ] 
      }, 
      { 
        "columns" : [ 
          { 
            "title" : "hiii", 
            "value" : 50 
          } 
        ] 
      } 
    ] 
} 

Ожидаемый результат:

{ 
"_id" : 15, 
"items" : [ 
     { 
       "columns" : [ 
         { 
           "title" : "hahaha", 
           "value" : 20 
         } 
       ] 
     }, 
     { 
       "columns" : [] 
     } 
] 

}

Раствор для MongoDB Shell:

let value = "hahaha"; 

db.coll.aggregate([ 
    { 
     "$addFields": { 
      "items": { 
       "$map": { 
        "input": "$items", 
        "as": "item", 
        "in": { 
         "columns": { 
          "$filter": { 
           "input": "$$item.columns", 
           "as": "elt", 
           "cond": { "$eq": [ "$$elt.title", value ] } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
]) 

MongoDB версия: 3.4.1
Весенняя версия: 1.4.3

ответ

1

Вы можете попробовать следующее, но вам нужно использовать версию 1.8.5.

Aggregation aggregation = newAggregation(
      project("_id").and(new AggregationExpression() { 
       @Override 
       public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { 
        DBObject filter = new BasicDBObject("input", "$$item.columns").append("as", "elt").append("cond", 
          new BasicDBObject("$eq", Arrays.<Object>asList("$$elt.title", "hahaha"))); 
        DBObject map = new BasicDBObject("input", "$items").append("as", "item").append("in", filter); 
        return new BasicDBObject("$map", map); 
       } 
      }).as("items") 
); 

Поддержка некоторых операторов агрегации Mongo3.2 была добавлена ​​в 1.10.0.RC1. Если вы в порядке с обновлением для выпуска версии кандидата, вы можете использовать приведенную ниже версию. Я не мог найти стадию $addFields в RC, поэтому остался этап $project.

Aggregation aggregation = newAggregation(
      project("_id") 
        .and(mapItemsOf("items").as("item").andApply(filter("item.columns") 
          .as("elt") 
          .by(valueOf("elt.title").equalToValue("hahaha")) 
        )).as("items") 
); 

Статическая Импорт:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter; 
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf; 
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf; 
+0

Спасибо за ваше предложение, но изменения версии слишком сложна для меня. – Spider

+0

Весенняя ботинок 1.4.3 имеет версию весеннего монго db 1.9.6. Поэтому первый вариант должен работать на вас. Ты пробовал ? – Veeram

 Смежные вопросы

  • Нет связанных вопросов^_^