2017-06-09 4 views
0

私はいくつかの文書を保存するためにMongoDBでSpringデータを使用しています。ドキュメントを保存するときに、Mongoに空のオブジェクトが含まれないようにしたいと思います。 (どのように)達成することができますか? SpringデータMongoDB - 空のオブジェクトを無視する

は、私は、次の主要なクラスがあるとしましょう:

MainDoc main = new MainDoc(); 
main.setTitle("someTitle"); 
main.setSubDoc(new SubDoc()); 
:私は、次のオブジェクトを保存しようとするならば今

public class SubDoc { 

    private String title; 
    private String info; 

} 

:以下のクラスのオブジェクトを含む

@Document(collection = "main_doc") 
public class MainDoc { 
    @Id 
    private String id; 

    private String title; 
    private SubDoc subDoc; 
} 

注:現実に私はSubDocがこのように設定されているという事実を制御しません。空でも埋めることもできます。私が望むのは、要素のプロパティ/フィールドがすべてNULLの場合、mongoにはまったく格納されないということです。上記の例のために、私は次のような結果を望むので、私は希望何

{ 
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3", 
    "title": "someTitle", 
    "subDoc": {} 
} 

要素のみヌルのプロパティが含まれている場合、それらは全く保存されないということです: これはMongoの中でこのようなものになり:事前に

@NoRepositoryBean 
public interface MainRepo extends CrudRepository<MainDoc, String> { 

    // save inherited 

} 

感謝を:文書の

{ 
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3", 
    "title": "someTitle" 
} 

の保存は、次のようにリポジトリの助けを借りて行われます。

+1

「main.setSubDoc(new SubDoc());」をコールしないでください。これを空に設定しています。あなたがそれを呼んでいなければ、それはそこにはありません。 –

+0

はい、私の実際の使用例では、私はその部分を制御することはできません。私は本当にそれがマッピング中に行われる必要があります。申し訳ありませんが、それについてもっと明確にすべきです。 – CounterFlame

+0

あなたはあなたの質問にもっと具体的になることができますか?そこに置くべきデータがない場合、あなたは単に電話をしていないと私には思われます。おそらくあなたのコードに 'if'が必要でしょう。 –

答えて

1

あなたがここに行うことができます一つのことはMainDocのためにカスタムコンバータを書くことです:

public class MainDocConverter implements Converter<MainDoc, DBObject> { 
    @Override 
    public DBObject convert(final MainDoc source) { 
     final BasicDbObject dbObject = new BasicDBObject(); 
     ... 
     if(/* validate is subdoc is not null and not empty */) { 
      dbOject.put("subDoc", source.getSubDoc()); 
     } 
    } 
} 

例えば@Configurationファイルにあなたを登録することができます:あなたがしたくない場合

@Configuration 
@EnableMongoRepositories(basePackages = {"package"}) 
public class MongoConfig { 

    private final MongoDbFactory mongoDbFactory; 

    public MongoConfig(final MongoDbFactory mongoDbFactory) { 
     this.mongoDbFactory = mongoDbFactory; 
    } 

    @Bean 
    public MongoTemplate mongoTemplate() throws Exception { 

     final MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter()); 
     return mongoTemplate; 

    } 

    @Bean 
    public MappingMongoConverter getDefaultMongoConverter() throws Exception { 

     final MappingMongoConverter converter = new MappingMongoConverter(
       new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext()); 
     converter.setCustomConversions(new CustomConversions(Arrays.asList(new MainDocConverter()))); 

     return converter; 
    } 

} 

あなたのオブジェクトのためのカスタムコンバータを書くおもちゃは、デフォルトのものを使用することができますし、少しそれを変更します。

final Document document = (Document) getDefaultMongoConverter().convertToMongoType(mainDoc); 

if(/* validate is null or is empty */) { 
    document .remove("subDoc"); 
} 

mongoTemplate().save(document); 

実際には最良の方法ではありません。みんなが空のオブジェクトを書いたとして{}として格納する必要がありますが、コンバータはあなたのケースであなたを助けることができます。

+0

それは私が欲しいものを私に与えるだろうが、それはまだ多くの点検を必要とするだろう。カスタムコンバーターから最初にデフォルトの実装を呼び出し、dbObjectにフィールドが設定されておらず、その場合nullを返すかどうかを確認する方法がありますか? – CounterFlame

+1

@CounterFlame私は自分の答えを編集しました。あなたはそれのためのデフォルトコンバータを使用することができます。 –

関連する問題