データ]

  • リンク:/tag/mongodb/[MongoDB]


1概要

この記事は、Spring Data MongoDBの入門書です。


MongoTemplate



MongoRepository

の両方を使用して、各操作を説明するための実用的なテストを使用して、基本を説明します。


2

MongoTemplate


and MongoRepository



  • MongoTemplate

    ** は、Springの標準テンプレートパターンに準拠しており、基盤となる永続エンジンにすぐに使える基本的なAPIを提供します。

  • リポジトリ** はSpring Data中心のアプローチに従い、すべてのSpring Dataプロジェクトでよく知られているアクセスパターンに基づいて、より柔軟で複雑なAPI操作が付属しています。

どちらの場合も、依存関係を定義することから始める必要があります。たとえば、

pom.xml

でMavenを使用します。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-releasetrain</artifactId>
    <version>Lovelace-M3</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

マイルストーンリポジトリを

pom.xml

にも追加する必要があることに注意してください。

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

ライブラリの新しいバージョンがリリースされたかどうかを確認するには –

ここでリリースを追跡

** 3

MongoTemplate

の設定

**


3.1. XML設定

Mongoテンプレートの単純なXML設定から始めましょう:

<mongo:mongo-client id="mongoClient" host="localhost"/>
<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-ref="mongoClient"/>

まず、Mongoインスタンスの作成を担当するファクトリビーンを定義する必要があります。

次に、実際にテンプレートBeanを定義(そして設定)する必要があります。

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory"/>
</bean>

そして最後に、

@ Repository

アノテーション付きクラスで投げられた

MongoExceptions

を変換するためのポストプロセッサを定義する必要があります。

<bean class=
  "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


3.2. Javaの設定

それでは、MongoDB設定の基本クラス

AbstractMongoConfiguration

を拡張して、Java設定を使用して同様の設定を作成しましょう。

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "test";
    }

    @Override
    public MongoClient mongoClient() {
        return new MongoClient("127.0.0.1", 27017);
    }

    @Override
    protected String getMappingBasePackage() {
        return "org.baeldung";
    }
}

注:

AbstractMongoConfiguration

で既に定義されているので、前の設定で

MongoTemplate

beanを定義する必要はありません

次のように

AbstractMongoConfiguration

– を拡張せずに最初からあなたの設定を使用することもできます。

@Configuration
public class SimpleMongoConfig {

    @Bean
    public MongoClient mongo() {
        return new MongoClient("localhost");
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongo(), "test");
    }
}


4

MongoRepository


の設定


4.1. XML設定

カスタムリポジトリを利用する(

MongoRepository

を拡張する)には、3.1節からの設定を続けてリポジトリを設定する必要があります。

<mongo:repositories
  base-package="org.baeldung.repository" mongo-template-ref="mongoTemplate"/>


4.2. Javaの設定

同様に、セクション3.2で作成した設定を基にして、新しい注釈をミックスに追加します。

@EnableMongoRepositories(basePackages = "org.baeldung.repository")


4.3. リポジトリを作成する

それでは、設定後、既存の

MongoRepository

インターフェースを拡張してリポジトリを作成する必要があります。

public interface UserRepository extends MongoRepository<User, String> {
   //
}

これで、この

UserRepository

を自動配線し、

MongoRepository

からの操作を使用するか、カスタム操作を追加できます。

** 5

MongoTemplate

+を使用する

**


5.1.

インサート


挿入操作から始めましょう。空のデータベースから始めましょう。

{
}

今度は、新しいユーザーを挿入するとします。

User user = new User();
user.setName("Jon");
mongoTemplate.insert(user, "user");

データベースは次のようになります。

{
    "__id" : ObjectId("55b4fda5830b550a8c2ca25a"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jon"
}

** 5.2. __保存 – 挿入

__ **


save

操作には、保存または更新のセマンティクスがあります。idが存在する場合は更新を実行し、存在しない場合は挿入を実行します。

最初のセマンティクス、挿入を見てみましょう。これがデータベースの初期状態です


_:

_

{
}

新しいユーザーを

保存

したとき:

User user = new User();
user.setName("Albert");
mongoTemplate.save(user, "user");

エンティティがデータベースに挿入されます。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Albert"
}

次に、更新セマンティクスを使用した同じ操作

save

を見てみましょう。

** 5.3. __保存 – 更新+

__ **

それでは、既存のエンティティを操作しながら、更新セマンティクスを使って

save

を見てみましょう。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jack"
}

それでは、既存のユーザーを

保存

したときに、更新します。

user = mongoTemplate.findOne(
  Query.query(Criteria.where("name").is("Jack")), User.class);
user.setName("Jim");
mongoTemplate.save(user, "user");

データベースは次のようになります。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jim"
}

ご覧のとおり、この特定の例では、

save



update

のセマンティクスを使用しています。これは、与えられた

__id

を持つオブジェクトを使用するためです。


5.4.

UpdateFirst



updateFirst

は、クエリに一致する最初のドキュメントを更新します。

データベースの初期状態から始めましょう。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Alex"
    },
    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614c"),
        "__class" : "org.baeldung.model.User",
        "name" : "Alex"
    }]----

今度は

updateFirst

を実行します。

Query query = new Query();
query.addCriteria(Criteria.where("name").is("Alex"));
Update update = new Update();
update.set("name", "James");
mongoTemplate.updateFirst(query, update, User.class);

最初のエントリだけが更新されます。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "James"
    },
    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614c"),
        "__class" : "org.baeldung.model.User",
        "name" : "Alex"
    }]----


5.5.

UpdateMulti



UpdateMulti


は、指定されたクエリに一致するすべてのドキュメントを更新します

まず、

updateMulti

を実行する前のデータベースの状態です。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Eugen"
    },
    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614c"),
        "__class" : "org.baeldung.model.User",
        "name" : "Eugen"
    }]----

それでは、

updateMulti

オペレーションを実行しましょう。

Query query = new Query();
query.addCriteria(Criteria.where("name").is("Eugen"));
Update update = new Update();
update.set("name", "Victor");
mongoTemplate.updateMulti(query, update, User.class);

データベース内の両方の既存のオブジェクトが更新されます。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Victor"
    },
    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614c"),
        "__class" : "org.baeldung.model.User",
        "name" : "Victor"
    }]----


5.6.

FindAndModify


この操作は

updateMulti

のように機能しますが、変更前のオブジェクトを返します。

最初 –

findAndModify

を呼び出す前のデータベースの状態。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Markus"
}

実際のオペレーションコードを見てみましょう:

Query query = new Query();
query.addCriteria(Criteria.where("name").is("Markus"));
Update update = new Update();
update.set("name", "Nick");
User user = mongoTemplate.findAndModify(query, update, User.class);

返された

user object

は、データベース内の初期状態と同じ値です。

ただし、データベースの新しい状態は次のとおりです。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Nick"
}


5.7.

更新



upsert

の動作は

find and modifyその他のセマンティクス

に作用します。

データベースの初期状態から始めましょう。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Markus"
}

それでは、

upsert

を実行しましょう。

Query query = new Query();
query.addCriteria(Criteria.where("name").is("Markus"));
Update update = new Update();
update.set("name", "Nick");
mongoTemplate.upsert(query, update, User.class);

操作後のデータベースの状態は次のとおりです。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Nick"
}


5.8.

削除



remove

を呼び出す前のデータベースの状態。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Benn"
}

それでは、

remove

を実行しましょう。

mongoTemplate.remove(user, "user");

結果は予想どおりになります。

{
}

** 6. __MongoRepositoryを使う

__ **


6.1.

インサート


最初 –

挿入を実行する前のデータベースの状態:

{
}

それでは、新しいユーザーを挿入すると、次のようになります。

User user = new User();
user.setName("Jon");
userRepository.insert(user);

これがデータベースの最終状態です。

{
    "__id" : ObjectId("55b4fda5830b550a8c2ca25a"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jon"
}

この操作が

MongoTemplate

APIの

挿入

と同じように機能することに注意してください。

** 6.2.

保存

– __挿入

__ **

同様に –

save

は、

__MongoTemplate


APIの

save__操作と同じように機能します。

操作の

insert semantics

を見ることから始めましょう。これがデータベースの初期状態です。

{
}

それでは、

save

操作を実行します。

User user = new User();
user.setName("Aaron");
userRepository.save(user);

これにより、ユーザーがデータベースに追加されます。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Aaron"
}

この例では、

save



insert

セマンティクスとどのように連携しているかに注意してください。新しいオブジェクトを挿入するためです。

** 6.3.

保存

– __更新

__ **

それでは、同じ操作を見てみましょう。

まず、新しい__saveを実行する前のデータベースの状態です。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jack"81** 6
}

今 – 操作を実行します。

user = mongoTemplate.findOne(
  Query.query(Criteria.where("name").is("Jack")), User.class);
user.setName("Jim");
userRepository.save(user);

最後に、データベースの状態は次のとおりです。

{
    "__id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
    "__class" : "org.baeldung.model.User",
    "name" : "Jim"
}

既存のオブジェクトを使用しているので、この例では

save



update

semanticsとどのように連携するかをもう一度注意してください。


6.4.

削除



delete

を呼び出す前のデータベースの状態。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Benn"
}


delete

を実行しましょう。

userRepository.delete(user);

結果は単純になります。

{
}


6.5.

FindOne



findOne

が呼び出されたときのデータベースの状態。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Chris"
}

それでは、

findOne

を実行しましょう。

userRepository.findOne(user.getId())

既存のデータを返す結果:

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Chris"
}

** 6.6.

存在


exists

を呼び出す前のデータベースの状態。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Harris"
}

それでは、

exists

を実行しましょう。

boolean isExists = userRepository.exists(user.getId());

もちろんどちらが

true

を返します。


6.7.

__



findAll

を呼び出す前のデータベースの状態。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Brendan"
    },
    {
       "__id" : ObjectId("67b5ffa5511fee0e45ed614b"),
       "__class" : "org.baeldung.model.User",
       "name" : "Adam"
    }]----

それでは、

Sort

を指定して

findAll

を実行しましょう。

List<User> users = userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));

結果は** 昇順で名前順にソートされます。

----[    {
        "__id" : ObjectId("67b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Adam"
    },
    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Brendan"
    }]----


6.8.

__



findAll

を呼び出す前のデータベースの状態。

----[    {
        "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Brendan"
    },
    {
        "__id" : ObjectId("67b5ffa5511fee0e45ed614b"),
        "__class" : "org.baeldung.model.User",
        "name" : "Adam"
    }]----

ページネーションリクエストで

findAll

を実行しましょう。

Pageable pageableRequest = PageRequest.of(0, 1);
Page<User> page = userRepository.findAll(pageableRequest);
List<User> users = pages.getContent();


users

listの結果は、1人のユーザーのみになります。

{
    "__id" : ObjectId("55b5ffa5511fee0e45ed614b"),
    "__class" : "org.baeldung.model.User",
    "name" : "Brendan"
}


7. 注釈

最後に、Spring DataがこれらのAPI操作を推進するために使用する簡単な注釈についても説明しましょう。

@Id
private String id;

フィールドレベルの

@ Id

アノテーションは、

long



string

など、あらゆるタイプを装飾できます。


@ Id

フィールドの値がnullでない場合は、そのままデータベースに保存されます。それ以外の場合、コンバーターは

ObjectId

をデータベースに格納したいと見なします(

ObjectId、String

、または

BigInteger

workのいずれか)。

次へ –

@ドキュメント

:

@Document
public class User {
   //}

このアノテーションは、クラスをデータベースに永続化する必要があるドメインオブジェクトとして** マークするだけで、使用するコレクションの名前を選択することもできます。


8結論

この記事は、

MongoTemplate

APIと

MongoRepository

の両方を使用して、MongoDBとSpring Dataを併用するための簡単で包括的な紹介です。

これらすべての例とコードスニペットの実装は

見つけることができます



Githubの上に


– これはMavenベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。