AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

クエリでの String 関数の使用

このガイドでは、非表示 ORM 用のMongoDB拡張機能 を使用して、文字列フィールドで非表示クエリ言語(HQL)文字列関数を呼び出す方法を学習できます。 string 関数を使用すると、クエリの一部として string 値を測定、再フォーマット、結合できます。

SELECT 句で各関数を呼び出すことができます。 Hibernetes ORM 拡張機能は、各関数呼び出しを $project ステージのMongoDB集計式に変換します。 Hibernetes ORM 拡張機能では、 計算式のオペランドとして関数呼び出しをサポートしていないため、string 関数と算術演算子を組み合わせることはできません。

Hibernetes ORM 拡張機能は次の string 関数をサポートしています。

関数
MongoDB の変換

length(), character_length(), char_length()

upper()

lower()

concat(), ||

substring()

locate()

replace()

trim()

pad(), lpad(), rpad()

repeat()

$range と $reduce から計算

注意

サポートされていない String 関数

Hibernetes ORM 拡張機能は、HQL position()、overlay()、left()、right()、および collate()string 関数をサポートしていません。これらの関数のいずれかを呼び出すクエリでは、FeatureNotSupportedException がスローされます。

サポートされていない string 関数を使用するには、createNativeQuery() メソッドを呼び出し、関連する演算子をMongoDB問い合わせ言語のステートメントに含めます。詳細については、「 ネイティブデータベースクエリの実行 」ガイドを参照してください。

このガイドの例では、Atlasサンプルデータセットの sample_mflix.moviesコレクションを表す Movie エンティティを使用します。Movie エンティティには次の定義があります。

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.time.Instant;
import java.util.List;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private List<String> cast;
private List<String> directors;
private Instant released;
@Embedded
private Awards awards;
@OneToMany(mappedBy = "movie", fetch = FetchType.LAZY)
private List<Comment> comments;
public Movie(String title, String plot, int year, List<String> cast, List<String> directors, Instant released, Awards awards) {
this.title = title;
this.plot = plot;
this.year = year;
this.cast = cast;
this.directors = directors;
this.released = released;
this.awards = awards;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
public List<String> getDirectors() {
return directors;
}
public void setDirectors(List<String> directors) {
this.directors = directors;
}
public Awards getAwards() {
return awards;
}
public void setAwards(Awards awards) {
this.awards = awards;
}
public Instant getReleased() {
return released;
}
public void setReleased(Instant released) {
this.released = released;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
}

Hibernetes ORM 用のMongoDB拡張機能を使用してこのMongoDBサンプルコレクションと交流するJavaアプリケーションを作成する方法については、Get Started チュートリアルを参照してください。

このガイドの例では、String 値を保存する Movie エンティティの titleフィールドを使用します。

length(str)関数は、string 内の文字数を返します。この関数は、同じ関数のエイリアスであるcharacter_length(str) またはchar_length(str) として呼び出すこともできます。 Hibernetes ORM 拡張機能は $strLenCP 演算子への呼び出しを変換するため、この関数はバイトではなく Unicode コード ポイントをカウントします。

次の例では、 sample_mflix.moviesコレクション内の "The Hunger Games" 映画のタイトルと、タイトルの長さを返します。

var lengthResult = session.createQuery(
"select title, length(title) as titleLength from Movie where title = :title",
Object[].class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var row : lengthResult) {
System.out.println("Title: " + row[0] + ", Length: " + row[1]);
}
var lengthResult = entityManager.createQuery(
"select m.title, length(m.title) as titleLength from Movie m where m.title = :title",
Object[].class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var row : lengthResult) {
System.out.println("Title: " + row[0] + ", Length: " + row[1]);
}

Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。

{
"$project": {
"title": true,
"titleLength": {
"$strLenCP": "$title"
},
"_id": 0
}
}

upper(str) 関数と lower(str) 関数は、string を大文字または小文字に変換します。

次の例では、"The Hunger Games"映画のタイトルを大文字で返します。

var upperResult = session.createQuery(
"select upper(title) as upperTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var upperTitle : upperResult) {
System.out.println("Uppercase Title: " + upperTitle);
}
var upperResult = entityManager.createQuery(
"select upper(m.title) as upperTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var upperTitle : upperResult) {
System.out.println("Uppercase Title: " + upperTitle);
}

Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。

{
"$project": {
"upperTitle": {
"$toUpper": "$title"
},
"_id": 0
}
}

concat(x, y) 関数は、2 つ以上の値を 1 つの文字列に結合します。 Hibernetes ORM 拡張機能は、結合前に各オペランドを string に変換するため、数値を連結したり、数値を string 値に連結したりできます。

次の例では、 "The Hunger Games" 映画のタイトルに点を追加します。

var concatResult = session.createQuery(
"select concat(title, '!') as excitedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var excitedTitle : concatResult) {
System.out.println("Concatenated Title: " + excitedTitle);
}
var concatResult = entityManager.createQuery(
"select concat(m.title, '!') as excitedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var excitedTitle : concatResult) {
System.out.println("Concatenated Title: " + excitedTitle);
}

Tip

二重パイプ演算子(||)を使用して 2 つの値を結合することもできます。次のクエリは、前の例と同等です。

"select title || '!' as excitedTitle from Movie where title = :title"

Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。

{
"$project": {
"excitedTitle": {
"$concat": [
{ "$toString": "$title" },
{ "$toString": "!" }
]
},
"_id": 0
}
}

substring(str, start) 関数は、start 位置から始まる string の部分を返します。 start の位置は 1 に基づいているため、string の最初の文字は位置 1 にあります。結果を固定の文字数に制限するには、関数を substring(str, start, length) として呼び出します。

0 の start 位置または負の値を渡すと、非表示 ORM 拡張機能は string の先頭から読み取ります。 length も渡す場合、拡張機能は返された長さから最初の位置の前の文字を減算します。例、substring(str, -1, 3) は 1 文字を返し、substring(str, 0, 3) は 2 文字を返します。

次の例では、"The Hunger Games"映画のタイトルの最初の 6 文字を返します。

var substringResult = session.createQuery(
"select substring(title, 1, 6) as titlePrefix from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var titlePrefix : substringResult) {
System.out.println("Title Prefix: " + titlePrefix);
}
var substringResult = entityManager.createQuery(
"select substring(m.title, 1, 6) as titlePrefix from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var titlePrefix : substringResult) {
System.out.println("Title Prefix: " + titlePrefix);
}

locate(pattern, str) 関数は、string 内の pattern の最初の出現の 1 ベースの位置を返します。string にパターンが含まれていない場合は 0 を返します。

特定の位置で検索を開始するには、関数を locate(pattern, str, start) として呼び出します。 start の位置は 1 に基づいているため、string の最初の文字は位置 1 にあります。 0 の start 値または負の数を指定すると、位置 1 から検索が開始されます。

次の例では、映画「"The Hunger Games"」のタイトルにある部分文字列 "Hunger" の位置を返します。

var locateResult = session.createQuery(
"select locate('Hunger', title) as position from Movie where title = :title",
Integer.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var position : locateResult) {
System.out.println("Position: " + position);
}
var locateResult = entityManager.createQuery(
"select locate('Hunger', m.title) as position from Movie m where m.title = :title",
Integer.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var position : locateResult) {
System.out.println("Position: " + position);
}

関数は、string replace(str, pattern, replacement)内の のすべての出現をpatternreplacement に置き換えます。 Hibernetes ORM 拡張機能は $replaceAll 演算子への呼び出しを変換します。 3 つの引数はすべて文字列である必要があります。

次の例では、"The Hunger Games" 映画のタイトルにある部分文字列 "Hunger" を "Video" に置き換えます。

var replaceResult = session.createQuery(
"select replace(title, 'Hunger', 'Video') as newTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var newTitle : replaceResult) {
System.out.println("New Title: " + newTitle);
}
var replaceResult = entityManager.createQuery(
"select replace(m.title, 'Hunger', 'Video') as newTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var newTitle : replaceResult) {
System.out.println("New Title: " + newTitle);
}

trim(str) 関数は、string から先頭と末尾のスペースを削除します。文字列の一部の末尾のみから文字を削除するには、trim(leading char from str) または trim(trailing char from str) を使用します。文字列の両方の末尾からスペース以外の文字を削除するには、trim(both char from str) のように both と from キーワードを使用して指定します。

次の例では、"The Hunger Games" 映画のタイトルから先頭の "T" 文字を削除します。

var trimResult = session.createQuery(
"select trim(leading 'T' from title) as trimmedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var trimmedTitle : trimResult) {
System.out.println("Trimmed Title: " + trimmedTitle);
}
var trimResult = entityManager.createQuery(
"select trim(leading 'T' from m.title) as trimmedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var trimmedTitle : trimResult) {
System.out.println("Trimmed Title: " + trimmedTitle);
}

Hibernetes ORM 拡張機能は、前述のクエリを次の $project ステージに変換します。

{
"$project": {
"trimmedTitle": {
"$ltrim": {
"chars": "T",
"input": "$title"
}
},
"_id": 0
}
}

pad(str with length leading) 関数と pad(str with length trailing) 関数は、string str の先頭または末尾にスペースを追加することで、指定された length に string を拡張します。スペース以外の文字を使用するには、pad(str with 20 leading char)のように方向の後に文字を指定します。

また、lpad(str, length, padding) 関数と rpad(str, length, padding) 関数を呼び出すこともできます。これらは 1 文字以上の値を含む string を埋め込みます。 Hibernetes ORM 拡張機能は、必要に応じてパディング値を必要な回数繰り返し、ターゲットの長さに達するようにそれを切り捨てます。例、lpad('x', 6, 'ab') は "ababax" を返します。

このような場合、パディングは次のように動作します。

  • ターゲットの長さが string より小さい場合、 Hibernetes ORM 拡張機能は string をターゲットの長さまで切り捨て、ターゲットの長さの後の文字を削除します。

  • ターゲットの長さが負の場合、関数は空の string を返します。

  • パディング値が空の string の場合、関数は元の string を返します。

次の例では、先頭のアスタリスクを使用して、"The Hunger Games"映画のタイトルを 20 文字に埋め込みます。

var padResult = session.createQuery(
"select pad(title with 20 leading '*') as paddedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var paddedTitle : padResult) {
System.out.println("Padded Title: " + paddedTitle);
}
var padResult = entityManager.createQuery(
"select pad(m.title with 20 leading '*') as paddedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var paddedTitle : padResult) {
System.out.println("Padded Title: " + paddedTitle);
}

repeat(str, count) 関数は、str の count コピーを含む string を返します。

次の例では、"The Hunger Games" の映画のタイトルを 2 回繰り返されるように返します。

var repeatResult = session.createQuery(
"select repeat(title, 2) as repeatedTitle from Movie where title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var repeatedTitle : repeatResult) {
System.out.println("Repeated Title: " + repeatedTitle);
}
var repeatResult = entityManager.createQuery(
"select repeat(m.title, 2) as repeatedTitle from Movie m where m.title = :title",
String.class)
.setParameter("title", "The Hunger Games")
.getResultList();
for (var repeatedTitle : repeatResult) {
System.out.println("Repeated Title: " + repeatedTitle);
}

クエリフィルターの作成とクエリ ステートメントでの演算子の使用の詳細については、「 クエリの指定」ガイドを参照してください。

クエリで日時関数を呼び出す方法については、「 クエリで日時関数を使用するガイド 」を参照してください。

HQL と JQL を使用してクエリを実行する方法の詳細については、非表示の ORM ドキュメントの「非表示のクエリ言語へのガイド」を参照してください。