2017-11-22 14 views
0

ネストされたドキュメントを照会するのに助けが必要です。 MongoDBでSpringブートを使用する。Map Key Springリポジトリに基づいてMongoDbを照会してください

構造:

public class Holiday { 
    @Id 
    private String id; 

    private Integer year; 

    private Map<String, List<HolidayElement>> holidays = new HashMap<>(); 
} 

public class HolidayElement { 

    private String name; 

    @JsonFormat(pattern="yyyy-MM-dd") 
    private Date date; 

    private String note; 
} 

JSONのように見えるすべてのものを保存した後:

今、私は、例えば得ることができる方法
[ 
    { 
     "id": "5a153331b3cb1f0001e1edeb", 
     "year": 2017, 
     "holidays": { 
     "BB": [ 
      { 
       "name": "Neujahrstag", 
       "date": "2017-01-01", 
       "note": "" 
      }, 
      ... 
     ], 
     "HH": [ 
      { ... } 
     ] 
    } 
    ] 

:状態は "BB" である "HolidayElement" の一覧を?

+0

なぜListの代わりにHolidayElementsのマップを使用しますか?地図は照会するのが難しいです。具体的な理由がない場合は、リストを参照して、そのBB、HH情報HolidayeElementも入れるか、またはその情報とHolidayElementを新しいクラスにラップし、この新しいクラスのListを使用することをお勧めします。 – barbakini

+0

mongodb MongoRepositoryまたはMongoTemplateを使用していますか? – pvpkiran

+0

私は建築家から次の構造を持っています。それができないなら、私は彼と話すことができます.. @pvpkiran MongoRepositoryの使用 –

答えて

0

HolidayRepositoryのようなリポジトリがあると仮定すると、MongoTemplateを使用するため、カスタム実装を作成する必要があります。だからあなたのHolidayRepositoryは

@Repository 
public interface HolidayRepository extends MongoRepository<Holiday, String>, HolidayRepositoryCustom { 

} 

のように見て、この

public class HolidayRepositoryImpl implements HolidayRepositoryCustom { 


    private final MongoTemplate mongoTemplate; 

    @Autowired 
    public HolidayRepositoryImpl(final MongoTemplate mongoTemplate) { 
    this.mongoTemplate = mongoTemplate; 
    } 

    @Override 
    public List<HolidayElement> findByMapId(String mapId) { 

    final QueryBuilder queryBuilder = QueryBuilder.start(); 
    queryBuilder 
     .and("holidays."+mapId).exists(true); 

    final DBObject projection = new BasicDBObject(); 
    projection.put("holidays."+mapId, 1); 

    String collectionName = "Holiday";//Change to your collection name 
    try(final DBCursor dbCursor = mongoTemplate.getCollection(collectionName).find(queryBuilder.get(), projection)){ 
     if(dbCursor.hasNext()){ 
     DBObject next = dbCursor.next(); 
     Map<String, List<HolidayElement>> holidayElements = 
      (Map<String, List<HolidayElement>>) next.get("holidays"); 
     return holidayElements.get(mapId); 
    } 
    } 
    return Lists.newArrayList(); 
    } 
} 
のようになります。HolidayRepository

public interface HolidayRepositoryCustom { 

    List<HolidayElement> findByMapId(final String mapId); 
} 

と同じディレクトリ(非常に重要)とのImplクラスに2つの新しいファイルHolidayRepositoryCustomとHolidayRepositoryImplを宣言します

+0

うわー、それは最高です!どうもありがとう!しかし、私はHolidayElementのリストが必要です。クラスのタイプを変更して動作させるだけですか? –

+0

nope。プロジェクションを追加してみてください。 – pvpkiran

+0

よろしくお願いします。おかげで –

関連する問題