メインコンテンツへ移動

MongoDB vector store

MongoDBVector クラスは、MongoDB Atlas Vector Search を使用したベクトル検索を提供します。MongoDB コレクション内で効率的な類似度検索とメタデータフィルタリングを利用できます。

インストール
インストールへの直接リンク

npm install @mastra/mongodb@latest

使用例
使用例への直接リンク

import { MongoDBVector } from '@mastra/mongodb'

const store = new MongoDBVector({
id: 'mongodb-vector',
uri: process.env.MONGODB_URI,
dbName: process.env.MONGODB_DB_NAME,
})

埋め込みフィールドのパスをカスタマイズする
埋め込みフィールドのパスをカスタマイズするへの直接リンク

埋め込みをネストされたフィールド構造に保存する必要がある場合(既存の MongoDB コレクションとの統合など)は、embeddingFieldPath オプションを使用します。

import { MongoDBVector } from '@mastra/mongodb'

const store = new MongoDBVector({
id: 'mongodb-vector',
uri: process.env.MONGODB_URI,
dbName: process.env.MONGODB_DB_NAME,
embeddingFieldPath: 'text.contentEmbedding', // Store embeddings at text.contentEmbedding
})

コンストラクターオプション
コンストラクターオプションへの直接リンク

id:

string
この vector store インスタンスの一意な識別子

uri:

string
MongoDB 接続文字列

dbName:

string
使用する MongoDB データベースの名前

options?:

MongoClientOptions
省略可能な MongoDB クライアントオプション

embeddingFieldPath?:

string
= embedding
埋め込みベクトルを保存するフィールドのパス。ドット記法によるネストされたパス(例: 'text.contentEmbedding')に対応します。

メソッド
メソッドへの直接リンク

connect()
connectへの直接リンク

MongoDB サーバーへの接続を確立します。初回使用時に自動で呼び出されますが、必要に応じて明示的に呼び出すこともできます。

await store.connect()

createIndex()
createindexへの直接リンク

MongoDB に新しいベクトルインデックス(コレクション)を作成します。

indexName:

string
作成するコレクションの名前

dimension:

number
ベクトルの次元数(埋め込みモデルと一致させる必要があります)

metric?:

'cosine' | 'euclidean' | 'dotproduct'
= cosine
類似度検索の距離指標

filterFields?:

string[]
Atlas vectorSearch インデックスでフィルターフィールドとして宣言するメタデータフィールド名(metadata.<field> として登録)。宣言済みフィールドだけを使用するクエリは、候補 _id の事前フィルタリングを行わず $vectorSearch に直接プッシュされるため、大規模な結果セットでの 16 MB BSON 制限を回避できます。未宣言フィールドを参照するフィルターや、$vectorSearch が対応していない演算子を使用するフィルターは、自動的に事前フィルターへフォールバックします。

collectionName?:

string
インデックス名を持つ管理対象コレクションではなく、既存の運用コレクションにベクトルを保存します。指定した場合、この store がコレクションを作成または削除することはありません。デフォルトは indexName です。

searchIndexName?:

string
コレクションに作成する Atlas vectorSearch インデックスの名前。デフォルトは ${indexName}_vector_index です。

allowWrites?:

boolean
= false
持ち込みコレクションへの書き込み操作(upsertupdateVectordeleteVectordeleteVectors)をオプトインで有効にします。BYO インデックスはデフォルトで読み取り専用であり、store が呼び出し元所有の運用ドキュメントを変更または削除することはありません。常に書き込み可能な管理対象コレクションでは無視されます。このポリシーはインデックス登録とともに永続化され、再起動後も維持されます。

waitForIndexReady()
waitforindexreadyへの直接リンク

作成後のインデックスが準備完了になるまで待機します。操作の実行前にインデックスの準備完了を確実にしたい場合に便利です。

indexName:

string
待機するインデックスの名前

timeoutMs?:

number
= 60000
最大待機時間(ミリ秒)

checkIntervalMs?:

number
= 2000
状態確認の間隔(ミリ秒)

upsert()
upsertへの直接リンク

コレクション内のベクトルとメタデータを追加または更新します。BYO コレクションはデフォルトで読み取り専用のため、持ち込みインデックスでは createIndex() の実行時に allowWrites: true を指定する必要があります。

indexName:

string
挿入先のコレクション名

vectors:

number[][]
埋め込みベクトルの配列

metadata?:

Record<string, any>[]
各ベクトルのメタデータ

ids?:

string[]
省略可能なベクトル ID(未指定の場合は自動生成されます)

documents?:

string[]
ベクトルとともに保存する省略可能なドキュメント本文

query()
queryへの直接リンク

省略可能なメタデータフィルタリングを使用して類似ベクトルを検索します。

indexName:

string
検索対象のコレクション名

queryVector:

number[]
類似ベクトルを検索するためのクエリベクトル

topK?:

number
= 10
返す結果の数

filter?:

Record<string, any>
メタデータフィルター(metadata フィールドに適用)

documentFilter?:

Record<string, any>
元のドキュメントフィールドに対するフィルター(メタデータに限定されません)

includeVector?:

boolean
= false
結果にベクトルデータを含めるかどうか

numCandidates?:

number
= 20 * topK (capped at 10000)
上位 K 件を選択する前に HNSW グラフが検討する候補数。値を大きくすると、レイテンシーと引き換えに再現率が向上します。参照: https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/

metadataMode?:

'field' | 'document'
= field
'field'(デフォルト)は管理対象の metadata / document フィールドを射影し、filter フィールドを metadata サブドキュメントと照合します。'document' はソースドキュメント全体を metadata として返し、filter フィールドを **root** ドキュメントと照合します(metadata. プレフィックスなし)。独自の構造を持つ運用コレクションの持ち込みに使用します。ペイロードの肥大化を避けるため、埋め込みフィールドはデフォルトで metadata から除外されます。保持して metadata に含め、トップレベルの vector としても公開するには includeVector: true を指定します。

createSearchIndex()
createsearchindexへの直接リンク

インデックスを支えるコレクションに Atlas Search(BM25/全文検索)インデックスをプロビジョニングし、textQuery()hybridQuery() が対象とするテキスト検索インデックスとして記録します。

管理対象コレクションと持ち込みコレクション:

  • 管理対象インデックス(collectionName なしで作成)では、createIndex() がすべての文字列フィールドを対象とする ${collectionName}_search_index という名前の dynamic 全文インデックスを作成します。そのため createSearchIndex() が必要なのは、フィールドを限定したマッピングまたはカスタムインデックス名を使用する場合だけです。
  • 持ち込みインデックス(collectionName を指定して作成)では、createIndex() は全文インデックスを自動作成しません。呼び出し元が所有する運用コレクションでの textQuery() / hybridQuery() はオプトインです。createSearchIndex() を明示的に呼び出し、課金対象のテキストインデックスをプロビジョニングしてください。それまでは、textQuery() / hybridQuery() は存在しないインデックスをクエリせず、明確なエラーをスローします。

命名規則:

  • fields を指定し、searchIndexName を明示しない場合、フィールドマッピング済みインデックスは論理インデックスごとに一意な別個のデフォルト名(${collectionName}_${indexName}_search_fields_index)で作成されます。管理対象コレクションで自動作成される dynamic インデックスとの衝突によって無視されることを防ぎます。このインデックスはテキスト検索インデックスとして永続化されるため、textQuery() / hybridQuery() は制限されたマッピングを自動的に使用します。
  • searchIndexName を指定すると、その名前がそのまま使用、永続化されます。textQuery() / hybridQuery() は永続化された名前を自動的に解決します。各呼び出しの searchIndexName / textSearchIndexName パラメーターで名前を上書きすることもできます。

indexName:

string
検索インデックスを作成するコレクションに対応する Mastra インデックス名

fields?:

string[]
全文検索用にインデックス化するフィールド名。すべての文字列フィールドを対象とする dynamic マッピングでは省略します。

searchIndexName?:

string
= ${collectionName}_search_index (or ${collectionName}_${indexName}_search_fields_index when `fields` is given)
Atlas Search インデックスの名前。fields を指定してこれを省略すると、論理インデックスごとに一意な別個のデフォルト名が使用されます。これにより、自動作成された dynamic インデックスがフィールドマッピングを隠すことや、同じコレクション上の2つの論理インデックスが衝突することを防ぎます。

waitUntilReady?:

boolean
= false
true の場合、作成した全文インデックスが READY を報告するまで完了を待機します。予期しない遅延を避けるためデフォルトは false です。個別に待機する場合は waitForSearchIndexReady() を明示的に呼び出します。
await store.createSearchIndex({
indexName: 'precedents',
fields: ['note', 'description'],
})

フィールドマッピング済みインデックス名には論理 indexName が含まれるため、同じコレクション上の2つの論理インデックスには別々のテキストインデックスが割り当てられます。同じ論理インデックスを異なる fields で再作成する場合は、先に既存のインデックスを削除する必要があります(IndexAlreadyExists)。

waitForSearchIndexReady()
waitforsearchindexreadyへの直接リンク

インデックスの全文検索(BM25)インデックスが READY になるまで待機します。waitForIndexReady() がポーリングするのは vectorSearch インデックスだけです。createSearchIndex() は Atlas Search 全文インデックスの構築中に戻るため、直後の textQuery() / hybridQuery() は断続的に失敗することがあります。このメソッドを呼び出すか、createSearchIndex()waitUntilReady: true を渡すと、解決されたテキストインデックスが READY になるまで待機します。

indexName:

string
テキストインデックスの準備完了を待つインデックスの論理名

searchIndexName?:

string
解決されたテキスト検索インデックス名を上書き

timeoutMs?:

number
= 60000
最大待機時間(ミリ秒)

checkIntervalMs?:

number
= 2000
状態確認の間隔(ミリ秒)
await store.createSearchIndex({ indexName: 'precedents', fields: ['note'] })
await store.waitForSearchIndexReady({ indexName: 'precedents' })

textQuery()
textqueryへの直接リンク

Atlas Search インデックスに対して全文検索(BM25)を実行します。デフォルトでは、このインデックス用に記録されたテキスト検索インデックス(createSearchIndex() で設定、または createIndex() が自動作成する dynamic ${collectionName}_search_index)を対象とします。この呼び出しで特定のインデックスを対象にするには searchIndexName を渡します。

ここでのメタデータフィルターは、hybridQuery() と同様に $match ステージで適用されます。hybridQuery() のベクトル分岐では、インデックス作成時に filterFields で宣言されていないフィールドのフィルターが、query() と同じフォールバックによって候補 _id として透過的に具体化されるため、未宣言フィールドのフィルターでもエラーになりません。

indexName:

string
検索する Mastra インデックスの名前

query:

string
全文検索のクエリ文字列

paths:

string[]
検索対象のフィールドパス(例: ["note", "description"])

topK?:

number
= 10
返す結果の数

filter?:

Record<string, any>
メタデータフィルター(metadata フィールドに適用)

metadataMode?:

'field' | 'document'
= field
'field'(デフォルト)は管理対象の metadata / document フィールドを射影します。'document' はソースドキュメント全体を metadata として返します。

searchIndexName?:

string
この呼び出しで、解決された全文検索インデックス名を上書きします。デフォルトは createSearchIndex() / createIndex() によって永続化されたインデックスです。
const results = await store.textQuery({
indexName: 'precedents',
query: 'shell company offshore',
paths: ['note'],
topK: 10,
})

hybridQuery()
hybridqueryへの直接リンク

MongoDB のサーバー側 $rankFusion を使用して、ベクトル類似度と全文検索の結果を融合するハイブリッド検索を実行します。MongoDB 8.0 以降が必要で、8.1 以降では一般提供されています。8.0.x では有効化に MongoDB サポートへの依頼が必要な場合があり、Atlas 8.0.x など有効化された環境で動作します。全文検索インデックスが必要です。管理対象インデックスでは自動作成されますが、持ち込みコレクションでは先に createSearchIndex() を呼び出してオプトインする必要があります。

indexName:

string
検索する Mastra インデックスの名前

queryVector:

number[]
類似度検索のクエリベクトル

query:

string
全文検索のクエリ文字列

paths:

string[]
全文検索の対象となるフィールドパス(例: ["note", "description"])

topK?:

number
= 10
返す結果の数

filter?:

Record<string, any>
メタデータフィルター(ベクトルとテキストの両分岐に適用)

weights?:

{ vector?: number; text?: number }
融合時のベクトル結果とテキスト結果の相対的な重み(デフォルト: 1:1)

numCandidates?:

number
= 20 * topK (capped at 10000)
ベクトル検索分岐の候補数

metadataMode?:

'field' | 'document'
= field
'field'(デフォルト)は管理対象の metadata / document フィールドを射影します。'document' はソースドキュメント全体を metadata として返します。

textSearchIndexName?:

string
この呼び出しで、解決された全文検索インデックス名を上書きします。デフォルトは createSearchIndex() / createIndex() によって永続化されたインデックスです。
const results = await store.hybridQuery({
indexName: 'precedents',
queryVector: embedding,
query: 'shell company offshore',
paths: ['note'],
topK: 10,
weights: { vector: 1, text: 1.5 }, // Favor text matches
})

hybridQuery()$rankFusion ステージには MongoDB 8.0 以降が必要です。このステージは 8.1 以降で一般提供されています。8.0.x では有効化に MongoDB サポートへの依頼が必要な場合があり、Atlas 8.0.x など有効化された環境で動作します。古いバージョンを使用している場合、または 8.0.x 環境で $rankFusion が有効でない場合は、query()textQuery() を個別に使用し、クライアント側で結果をマージしてください。

describeIndex()
describeindexへの直接リンク

インデックス(コレクション)の情報を返します。

indexName:

string
詳細を取得するコレクションの名前

戻り値:

interface IndexStats {
dimension: number
count: number
metric: 'cosine' | 'euclidean' | 'dotproduct'
}

deleteIndex()
deleteindexへの直接リンク

ベクトルインデックスを削除します。動作はインデックスの作成方法によって異なります。

  • 管理対象インデックスcollectionName なしで作成): コレクション全体とそのすべてのデータを削除します。
  • 持ち込みインデックスcollectionName を指定して作成): Atlas vectorSearch インデックスと、createSearchIndex() で作成されている場合は対応する全文検索インデックスを削除します。呼び出し元の運用コレクションとドキュメントは保持されます。この store が、自身で作成していないコレクションを削除することはありません。

BYO の分類はインデックス作成時に永続的に記録されるため、別のプロセスでも正しく適用されます(セットアップジョブで作成したインデックスを、後で長時間稼働するサービスが削除する場合など)。物理コレクション名ではなく、必ず論理インデックス名createIndex で使用した indexName)を渡してください。

indexName:

string
削除するインデックスの論理名

listIndexes()
listindexesへの直接リンク

物理コレクション名ではなく、Mastra の論理インデックス名(createIndex に渡した indexName)を一覧表示します。運用コレクションにデータを保存する持ち込みインデックスでは、物理コレクション名ではなく論理インデックス名が返されます。この値はそのまま deleteIndex() / describeIndex() に渡せます。永続メタデータの導入前に作成された管理対象インデックスも、${name}_vector_index 検索インデックスを通じて検出されます。内部レジストリコレクションは一覧に含まれません。

戻り値: Promise<string[]>

updateVector()
updatevectorへの直接リンク

ID またはメタデータフィルターで単一のベクトルを更新します。idfilter のいずれか一方だけを指定する必要があります。

持ち込みコレクションはデフォルトで読み取り専用です。 BYO インデックスを allowWrites: true で作成していない場合、upsert()updateVector()deleteVector()deleteVectors() は USER カテゴリーのエラーをスローします。既存コレクションのインデックス作成を参照してください。

indexName:

string
ベクトルを含むコレクションの名前

id?:

string
更新するベクトルエントリの ID(filter とは同時に指定できません)

filter?:

Record<string, any>
更新するベクトルを特定するメタデータフィルター(id とは同時に指定できません)

update:

object
ベクトルやメタデータを含む更新データ

update.vector?:

number[]
更新する新しいベクトルデータ

update.metadata?:

Record<string, any>
更新する新しいメタデータ

deleteVector()
deletevectorへの直接リンク

ID を指定して、インデックスから特定のベクトルエントリを削除します。

indexName:

string
ベクトルを含むコレクションの名前

id:

string
削除するベクトルエントリの ID

deleteVectors()
deletevectorsへの直接リンク

ID またはメタデータフィルターで複数のベクトルを削除します。idsfilter のいずれか一方だけを指定する必要があります。

indexName:

string
ベクトルを含むコレクションの名前s to delete

ids?:

string[]
削除するベクトル ID の配列(filter とは同時に指定できません)

filter?:

Record<string, any>
削除するベクトルを特定するメタデータフィルター(ids とは同時に指定できません)

disconnect()
disconnectへの直接リンク

MongoDB クライアント接続を閉じます。store の使用後に呼び出してください。

レスポンス型
レスポンス型への直接リンク

クエリ結果は次の形式で返されます。

interface QueryResult {
id: string
score: number
metadata: Record<string, any>
vector?: number[] // Only included if includeVector is true
}

エラー処理
エラー処理への直接リンク

store は捕捉可能な型付きエラーをスローします。

try {
await store.query({
indexName: 'my_collection',
queryVector: queryVector,
})
} catch (error) {
// Handle specific error cases
if (error.message.includes('Invalid collection name')) {
console.error(
'Collection name must start with a letter or underscore and contain only valid characters.',
)
} else if (error.message.includes('Collection not found')) {
console.error('The specified collection does not exist')
} else {
console.error('Vector store error:', error.message)
}
}

既存コレクションのインデックス作成
既存コレクションのインデックス作成への直接リンク

管理対象コレクションを使用せず、既存の運用コレクションにベクトルインデックスを作成できます。MongoDB データベースにすでに存在するドキュメントへベクトル検索機能を追加する場合に便利です。

import { MongoDBVector } from '@mastra/mongodb'

const store = new MongoDBVector({
id: 'mongodb-vector',
uri: process.env.MONGODB_URI,
dbName: process.env.MONGODB_DB_NAME,
})

// Create a vector index on an existing 'transactions' collection
await store.createIndex({
indexName: 'precedents',
dimension: 1024,
collectionName: 'transactions', // Use existing collection
searchIndexName: 'txn_vec_idx', // Custom search index name
})

// Wait for the index to be ready
await store.waitForIndexReady({ indexName: 'precedents' })

// Query using document mode to get full source documents
const hits = await store.query({
indexName: 'precedents',
queryVector: embeddings,
topK: 5,
metadataMode: 'document', // Returns full document as metadata
})

// hits[0].metadata now contains all fields from the source document
console.log(hits[0].metadata.amount, hits[0].metadata.customField)

// Full-text / hybrid search on a BYO collection is opt-in: provision the text index first.
await store.createSearchIndex({ indexName: 'precedents', fields: ['note'] })

重要な注意事項:

  • コレクションはすでに存在し、embedding フィールド(または設定したカスタム embeddingFieldPath)を持つドキュメントを含んでいる必要があります
  • collectionName を使用する場合、コレクションが作成または削除されることはありません
  • BYO インデックスはデフォルトで読み取り専用です。 upsert()updateVector()deleteVector()deleteVectors() は、呼び出し元所有の運用ドキュメントを変更せず、明確なエラーをスローします。store にコレクションへの埋め込みの書き込みやドキュメントの削除を許可するには、createIndex({ ..., allowWrites: true }) で明示的にオプトインします。ポリシーは永続化され、再起動後も維持されます。このフラグなしで古いバージョンが書き込んだエントリは読み取り専用として扱われます(fail closed)
  • クエリでソースドキュメント全体を metadata として取得するには metadataMode: 'document' を使用します
  • 'document' モードでは、埋め込みはデフォルトで metadata から除外されます。保持してトップレベルの vector としても公開するには includeVector: true を渡します
  • 'document' モードのフィルタリングは root ドキュメントフィールドに作用し、ネストされた metadata. サブドキュメントには作用しません。filter: { lane: 'fraud' } は運用ドキュメントのトップレベル lane フィールドと一致します(デフォルトの 'field' モードでは、管理対象コレクションの修飾されていないフィールドは metadata.<field> に書き換えられます)。pushdown と $match のフォールバック経路の両方でこの動作が維持されます
  • ネイティブの ObjectId _id に対応しています。 運用コレクションでは一般に ObjectId をキーとして使用します。クエリ結果は _id を文字列(QueryResult.id の契約)に変換し、deleteVector() / updateVector() / deleteVectors() はその文字列を受け取り、基になる ObjectId ドキュメントと照合します。管理対象コレクション(文字列 _id)には影響しません
  • BYO コレクションでの全文検索とハイブリッド検索はオプトインです。全文インデックスは自動作成されないため、textQuery() / hybridQuery() の前に createSearchIndex() を呼び出します。全文インデックスは非同期で構築されます。直後にテキスト検索またはハイブリッド検索を行う場合は、waitForSearchIndexReady() を呼び出すか waitUntilReady: true を渡します
  • BYO インデックスに対する deleteIndex() はベクトルインデックス(作成されている場合はテキストインデックスも)を削除しますが、コレクションとドキュメントは保持します

ベストプラクティス
ベストプラクティスへの直接リンク

  • クエリ性能を最適化するため、フィルターで使用するメタデータフィールドにインデックスを作成します。
  • 予期しないクエリ結果を避けるため、メタデータでは一貫したフィールド名を使用します。
  • 効率的な検索を維持するため、インデックスとコレクションの統計を定期的に監視します。
  • 既存のコレクションにインデックスを作成する場合は、すべてのドキュメントに必須の embedding フィールドがあることを確認します。

使用例
使用例への直接リンク

MongoDB によるベクトル埋め込み
vector-embeddings-with-mongodbへの直接リンク

埋め込みは、Memory の semanticRecall がキーワードではなく意味に基づいて関連メッセージを取得するために使用する数値ベクトルです。

注記

本番環境では MongoDB Atlas Vector Search を推奨します。セルフホスト環境では、Atlas CLI によるローカル Atlas デプロイで Vector Search を利用できます。

この設定では、ローカル埋め込みモデル FastEmbed を使用して埋め込みベクトルを生成します。 使用するには @mastra/fastembed をインストールします。

npm install @mastra/fastembed@latest

Agent に次の内容を追加します。

src/mastra/agents/example-mongodb-agent.ts
import { Memory } from '@mastra/memory'
import { Agent } from '@mastra/core/agent'
import { MongoDBStore, MongoDBVector } from '@mastra/mongodb'
import { fastembed } from '@mastra/fastembed'

export const mongodbAgent = new Agent({
id: 'mongodb-agent',
name: 'mongodb-agent',
instructions:
'You are an AI agent with the ability to automatically recall memories from previous interactions.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({
storage: new MongoDBStore({
id: 'mongodb-storage',
uri: process.env.MONGODB_URI!,
dbName: process.env.MONGODB_DB_NAME!,
}),
vector: new MongoDBVector({
id: 'mongodb-vector',
uri: process.env.MONGODB_URI!,
dbName: process.env.MONGODB_DB_NAME!,
}),
embedder: fastembed,
options: {
lastMessages: 10,
semanticRecall: {
topK: 3,
messageRange: 2,
},
generateTitle: true, // generates descriptive thread titles automatically
},
}),
})

VoyageAI によるベクトル埋め込み
VoyageAI によるベクトル埋め込みへの直接リンク

VoyageAI は検索タスク向けに最適化された専用の埋め込みモデルを提供します。また、マルチモーダル埋め込み向けに MongoDB Atlas と統合されています。

npm install @mastra/voyageai@latest

基本的な使用例:

src/mastra/agents/example-mongodb-voyageai-agent.ts
import { Memory } from '@mastra/memory'
import { Agent } from '@mastra/core/agent'
import { MongoDBStore, MongoDBVector } from '@mastra/mongodb'
import { voyage } from '@mastra/voyageai'

export const mongodbVoyageAgent = new Agent({
id: 'mongodb-voyage-agent',
name: 'MongoDB VoyageAI Agent',
instructions: 'You are an AI agent with semantic recall powered by VoyageAI and MongoDB.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({
storage: new MongoDBStore({
id: 'mongodb-storage',
uri: process.env.MONGODB_URI!,
dbName: process.env.MONGODB_DB_NAME!,
}),
vector: new MongoDBVector({
id: 'mongodb-vector',
uri: process.env.MONGODB_URI!,
dbName: process.env.MONGODB_DB_NAME!,
}),
embedder: voyage, // VoyageAI's default model (voyage-3.5, 1024 dimensions)
options: {
lastMessages: 10,
semanticRecall: {
topK: 5,
messageRange: 2,
},
},
}),
})

専用モデル、マルチモーダル埋め込み、検索最適化を含む VoyageAI 埋め込みの詳細な例については、VoyageAI 埋め込みのドキュメントを参照してください。