2

他のオブジェクトの中に入れ子にされた配列に、最も「ベストプラクティスの方法」でオブジェクトを追加する必要があります。java mongodbの配列にオブジェクトを追加する

問題は、新しいオブジェクトを追加するだけでデータベースから配列全体をプルアップしたくないということです。これを行うには、新しいオブジェクトをクエリで配列に追加するのと同じように、より良い方法が必要ですか?

今のところ、含まれている投稿でビジネスオブジェクトをプルアップし、新しい投稿を追加してビジネスオブジェクトを更新しています。私が達成したい何

public interface BusinessRepository extends MongoRepository<Business, String> { 

    @Query(value="{ 'id' : ?0 }", fields="{ 'posts' : 1 }") 
    Business findOneIncludeOnlyPosts(String id, Pageable pageable); 
} 

は次のようなものです:

@Query(value="{ SOME QUERY }") 
void putPostInBusinessPosts(String id, Post post); 

は、それは可能ですか私はそれを、より安価な方法をしなければならないのですか?

使用:

  • 春ブート1.3.5
  • のmongo-javaのドライバ3.2.2

答えて

2

あなたはMongoRepositoryを使用してそれを達成することはできません。そのためにはMongoTemplateを使用する必要があります。

私はそれがより高価ではないと考えていますが、多分もっと冗長かもしれません。

import org.springframework.data.mongodb.core.MongoTemplate; 
import org.springframework.data.mongodb.core.query.Criteria; 
import org.springframework.data.mongodb.core.query.Query; 
import org.springframework.data.mongodb.core.query.Update; 

... 

Update update = new Update(); 
update.addToSet("posts", post); 
Criteria criteria = Criteria.where("_id").is(id); 
template.updateFirst(Query.query(criteria), update, "business"); 

とします。businessはコレクションの名前です。

+0

返信用Thx。 BusinessRepositoryインターフェースを使ってMongoRepositoryとMongoTemplateの両方を使用できる方法はありますか? – rilar

+1

あなたは[カスタムリポジトリ実装を持つ](http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.custom-implementations)と 'MongoTemplate 'それを –

+1

ところで' $ push'を起動させるには 'update.addToSet'の代わりに' update.push'を使うべきです。 –

関連する問題