Docs Menu
Docs Home
/
MongoDB Atlas
/ / /

S3 データのパスの定義

項目一覧

  • Overview
  • サポートされている解析関数
  • ファイル名からの NULL 値の解析
  • ファイル名からパディングされた数字の解析
  • サポートされていない解析関数
  • ファイル名から単一フィールドを解析
  • ファイル名から複数のフィールドを解析
  • 正規表現を使用してファイル名からフィールドを解析します
  • ファイル名からクエリ可能なデータの範囲を識別する
  • ファイル名からネストされたフィールドを識別する
  • ObjectId からのパーティションの作成
  • ファイルパスからのパーティションの作成
  • ISODate からのパーティションの作成
  • ファイルパスからの動的コレクション名の生成

S 3バケット内のドキュメントをクエリする場合、Atlas Data Federation の path値により、Data Federation はドキュメント内のデータをドキュメントのファイル名にマッピングできます。

pathは、 S 3バケット内のファイル名を計算フィールドに解析することをサポートしています。 Data Federation は、解析されたファイルから生成された各ドキュメントに計算フィールドを追加できます。 Data Federation は、計算されたフィールド値に対するクエリの対象をファイル名が一致するファイルのみにすることができます。 詳細については、 サポートされている解析関数を 参照してください。

path は、ファイルへのパスでパーティション属性を使用したパーティションの作成もサポートしています。 Data Federation は、パーティション属性で定義されたパラメーターに対するクエリの対象として、ファイル名またはパーティション プレフィックスにクエリが含まれるファイルのみを対象にできます。

S3バケット内の次のファイルを検討します。

/users/26/1234.json
/users/26/5678.json

JSONドキュメント1234.jsonには次のものが含まれています。

{
"name": "jane doe",
"age": 26,
"userID": "1234"
}

S3バケット内のファイルのフェデレーティッドデータベースインスタンスの構成では、次のpathを定義します。

"path": "/users/{age int}/{userID string}"

次は、Data Federation がpath定義から作成されたパーティションにクエリをマッピングする方法を示しています。

db.users.findOne( /users
{ /40
"age": 26 -----------------> /26
"userID": "1234" ----------> /1234.json
} /5678.json
)

パーティション属性の計算フィールドがドキュメントにすでに存在する場合、Data Federation はクエリを適切なファイルにマッピングします。 計算フィールドが存在しない場合、Data Federation は計算フィールドをドキュメントに追加します。 たとえば、 ageフィールドが1234.jsonに存在しない場合、Data Federation はageフィールドと値を1234.jsonに追加します。

ファイル名に単一の解析関数を指定できます。
/path/to/files/{<fieldA> <data-type>}
ファイル名に複数の解析関数を指定できます。
/path/to/files/{<fieldA> <data-type>}-{<fieldB> <data-type>}
ファイル名内の静的文字列と一緒に解析関数を指定できます。
/path/to/files/prefix-{<fieldA> <data-type>}-suffix
ドット( ファイル名へのパスにある. )の順にクリックします。
/path/to/files/{<fieldA>.<fieldB> <data-type>}
パーティションを作成するファイルへのパスにObjectIdsを指定できます。
/path/to/files/{objid objectid}
パーティションを作成するファイルへのパスで、 ObjectIdsの範囲を指定できます。
/path/to/files/{min(obj) objectid}-{max(obj) objectid}
ファイル名へのパスと一緒に解析関数を指定できます。
/path/{<fieldA> <data-type>}/{<fieldB> <data-type>}/{<fieldC> <data-type>}/*
ファイル名へのパスに応じてISODateの正規表現を指定できます。
/path/to/files/{<field-name> isodate("<date-format>"):\\<regex>}

注意

pathを指定する場合

  • パーティション属性のデータ型を指定します。

  • パーティション属性の型が解析するデータ型と一致していることを確認します。

  • delimiterで指定された区切り文字を使用します。

同じ型の属性を指定する場合は、以下のいずれかを行います。

は、ファイルパス内の属性の代わりに空のData Federation string( )を、""BSON を除くすべてのAtlas Data Federation 属性タイプの null 値として自動的に解析します。stringstring を使用すると、空のstringはBSON null 値またはBSON空のstring値のいずれかを表すことができます。 Atlas Data Federation は、 string属性タイプの BSON 値を解析しません。 これにより、 S3から読み取られたドキュメントに、競合するタイプの BSON 値が追加されるのを回避できます。

次のS3フェデレーティッドデータベースインスタンス ストアについて考えてみましょう。

/records/january/1.json
/records/february/1.json
/records//1.json
For the path ``/records/{month string}/*``, Data Federation does not add any
computed fields for the ``month`` attribute to documents generated
from the third record in the above store.

注意

S3にファイルを書き込む場合は、すべての Atlas Data Federation 属性タイプのファイル名に、 BSON null 値を空の文字列として書き込みます。

ファイル パスには、先頭にゼロがある数値を含めることができます。 Data Federation がintepoch_millisepoch_secsなどの属性タイプの埋め込み数値を正しく解析するには、正規表現を使用して値の桁数を指定します。

次のファイルを含むS3ストアについて考えてみましょう。

|--users
|--001.json
|--002.json
...

次のpath構文では、正規表現を使用してファイル名内の桁の数を指定します。 Data Federation は、パーティション属性に対応するパスの部分を識別し、そのパーティション属性をタイプintにマッピングします。

/users/{user_id int:\\d{3}}

同じファイル名に対して、区別なしで連続した解析関数を指定すると、結果の整合性が失われる可能性があります。

次のファイルを含むS3ストアについて考えてみましょう。

|--food
|--icecream
|--peanutbutter

ここで、 foodディレクトリ内のファイルへの次のパスを検討します。

/food/{first string}{second string}/

ファイル名部分文字列のどの部分が first 文字列属性と second string属性と一致するかを判断する方法はありません。 したがって、Atlas Data Federation はすべてをfirstに一致させます。

代わりに、次のような正規表現を持つ属性を使用することを検討してください。

  • /food/{first string:\\D{3}}{second string:\\D{5}}

    上記のパスでは、 firstが3桁の非数字の文字と一致するようにし、 secondが次の5桁の非数字の文字と一致することを指定しています。

  • /food/{first string:[A-Z]{3}}{second string:[a-z]{5}}

    上記のパスは、 firstから3の大文字と小文字、 secondから5の小文字に一致します。

次の例は、ファイル名を計算フィールドに解析する方法を示しています。

フェデレーティッドデータベースインスタンス ストアaccountingArchiveに含まれるファイル名で、ファイル名が請求日を記述するファイルを含む場合を考えてみましょう。 たとえば、ファイル名/invoices/1564671291998.jsonには UNIX タイムスタンプ1564671291998の請求書が含まれています。

次のdatabasesオブジェクトは、ファイル名を UNIX タイムスタンプとして解析してフィールドinvoiceDateを生成します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceDate epoch_millis}"
}
]
}
]
}
]

Data Federation は、計算されたフィールドと値を、ファイル名から生成された各ドキュメントに追加します。 サンプル ファイル名から生成されたドキュメントには、フィールドinvoiceDate: ISODate("2019-08-01T14:54:51Z")が含まれています。 invoiceDateフィールドのクエリは、指定された値に一致するファイルのみを対象にすることができます。

フェデレーティッドデータベースインスタンス ストアaccountingArchiveに請求書番号と請求日が記載されているファイルを含むものを考えてみましょう。 たとえば、ファイル名/invoices/MONGO12345-1564671291998.jsonには UNIX タイムスタンプ1564671291998の請求書MONGODB12345が含まれています。

次のdatabasesオブジェクトは以下を生成します。

  • ファイル名の最初のセグメントを string として解析する場合の フィールドinvoiceNumber

  • ファイル名の 2 番目のセグメントを UNIX タイムスタンプとして解析するフィールドinvoiceDate

"databases" : [
{
"name": "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}-{invoiceDate epoch_millis}"
}
]
}
]
}
]

Data Federation は、計算されたフィールドと値を、ファイル名から生成された各ドキュメントに追加します。 サンプル ファイル名から生成されたドキュメントには、次のフィールドが含まれます。

  • invoiceNumber : "MONGODB12345"

  • invoiceDate : ISODate("2019-08-01T14:54:51Z")

フィールドと invoiceNumberinvoiceDateフィールドの 両方 を含むクエリは、指定された値に一致するファイルのみを対象にすることができます。

フェデレーティッドデータベースインスタンス ストアaccountingArchiveに請求書番号と請求日が記載されているファイルを含むものを考えてみましょう。 たとえば、ファイル名/invoices/MONGODB12345-20190102.jsonには日付20190102の請求書MONGODB12345が含まれています。

次のdatabasesオブジェクトは以下を生成します。

  • フィールドinvoiceNumber (ファイル名の最初のセグメントを string として解析)

  • フィールドyearは、正規表現を使用して、ファイル名の 2 番目のセグメントの最初の4桁のみを int として解析します。

  • フィールドmonthは、正規表現を使用して、ファイル名の 2 番目のセグメントの次の2桁のみを int として解析します。

  • フィールドdayは、正規表現を使用して、ファイル名の 2 番目のセグメントの次の2桁のみを int として解析します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}-{year int:\\d{4}}{month int:\\d{2}}{day int:\\d{2}}"
}
]
}
]
}
]

Data Federation は、計算されたフィールドと値を、ファイル名から生成された各ドキュメントに追加します。 サンプル ファイル名から生成されたドキュメントには、次のフィールドが含まれます。

  • invoiceNumber : "MONGODB12345"

  • year : 2019

  • month: 01

  • day: 02

重要

path で指定された正規表現stringをエスケープする必要があります。 たとえば、正規表現stringにdouble引用符が含まれている場合は、それらの値をエスケープする必要があります。 Data Federation は パッケージ構文 をサポートしています ストレージ構成の正規表現用。

生成されたすべてのフィールドを含むクエリは、指定された値に一致するファイルのみを対象にすることができます。

Tip

以下も参照してください。

フェデレーティッドデータベースインスタンス ストアaccountingArchiveに含まれるファイルについて考えてみましょう。ファイル名はファイルに含まれるデータの範囲を記述するため、 たとえば、ファイル名/invoices/1546367712000-1549046112000.jsonには、2019-01-01 から 2019-01-02 までの期間の請求書が含まれており、日付範囲は UNIX エポックからの経過ミリ秒で表されます。

次のdatabasesオブジェクトは、ファイル名の最初のセグメントとして最小時間範囲を識別し、ファイル名の 2 番目のセグメントとして最大時間範囲を識別します。

"databases" : [
{
"name: "accounting",
"collections" : [
{
"name: "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{min(invoiceDate) epoch_millis}-{max(invoiceDate) epoch_millis}"
}
]
}
]
}
]

Data Federation は"invoiceDate"フィールドのクエリを受信すると、指定されたパスを使用して、クエリに一致するデータが含まれるファイルを識別します。

invoiceDateフィールドのクエリは、 minmaxの日付を含め、指定された値をキャプチャする範囲のファイルのみを対象にすることができます。

重要

予期しない動作や望ましくない動作を避けるために、 ファイルに含まれるすべてのドキュメントに最小範囲と最大範囲に指定されたフィールドが存在する必要があります。 Data Federation は、基礎となるデータがこの制約に準拠しているかどうかの検証を実行しませ

Tip

以下も参照してください。

Data Federation は、ネストされたデータ値がファイル名でもある場合に、ネストされたデータのクエリをサポートします。 ドット演算子( { path. )を使用して、ストレージ構成内のパーティション属性をドキュメント内のネストされたフィールドにマッピングします。

フェデレーティッドデータベースインスタンス ストアaccountingArchiveについて考えてみましょう。 フェデレーティッドデータベースインスタンス ストアには、ドキュメント内のネストされたフィールドの値と一致する名前を持つファイルが含まれています。 例:

accountingArchive
|--invoices
|--January.json
|--February.json
...

たとえば、 January.jsonファイルに次のフィールドを含むドキュメントが含まれているとします。

{
"invoice": {
"invoiceNumber" : "MONGODB12345",
"year" : 2019,
"month": "January", //value matches filename
"date": 02
},
"vendor": "MONGODB",
...
}

次のdatabasesオブジェクトは、 monthをドキュメント内のネストされたフィールドとして識別します。 databasesオブジェクトは、ドキュメントを含むファイルの名前としてmonthの値も識別します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoice.month string}"
}
]
}
]
}
]

Atlas Data Federation は、 Januaryなどの特定の月に関するクエリを受信すると、指定されたパスを使用して、クエリに一致するデータが含まれるファイルを識別します。

ファイルへのパスでObjectIdを指定できます。 ファイル名にObjectIdが含まれているファイルの場合、Atlas Data Federation は 各ObjectId用にパーティションを作成します。

次のフェデaccountingArchiveデータベースインスタンス ストアについて考えてみましょう。 このデータ ストアには、ファイル名にObjectIdが含まれるファイルが含まれています。

accountingArchive
|--invoices
|--507f1f77bcf86cd799439011.json
|--507f1f77bcf86cd799439012.json
|--507f1f77bcf86cd799439013.json
|--507f1f77bcf86cd799439014.json
|--507f1f77bcf86cd799439015.json

次のdatabasesオブジェクトはObjectIds用のパーティションを作成します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{objid objectid}"
}
]
}
]
}
]

または、フェデレーティッドデータベースインスタンス ストアaccountingArchiveに、ファイル名にObjectIdsの範囲が含まれるファイルが含まれているとします。 例:

accountingArchive
|--invoices
|--507f1f77bcf86cd799439011-507f1f77bcf86cd799439020.json
|--507f1f77bcf86cd799439021-507f1f77bcf86cd799439030.json
|--507f1f77bcf86cd799439031-507f1f77bcf86cd799439040.json

次のdatabasesオブジェクトは、 ObjectIdsの指定された範囲のパーティションを作成します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{min(obj) objectid}-{max(obj) objectid}"
}
]
}
]
}
]

Data Federation はObjectIdのクエリを受信すると、指定されたパスを使用して、クエリに一致するデータが含まれるファイルを識別します。

ファイル名までの任意のパスで解析関数を指定できます。 各計算フィールドは、 パス上の解析関数に基づいています。 データをクエリする際、Atlas Data Federation は各計算フィールドをパーティションに変換します。 次に、サブディレクトリと同義であるパーティションは、精度の高いファイルをフィルタリングするために使用されます。

次のディレクトリ構造を持つフェデレーティッドデータベースインスタンス ストアaccountingArchiveについて考えます。

invoices
|--MONGO12345
|--2019
|--01
|--02

次のdatabasesオブジェクトは、フィルタリングされたファイルの少数を含むinvoiceNumberyearmonthdayのパーティションを作成します。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}/{year int}/{month int:\\d{2}}/{day int:\\d{2}}/*"
}
]
}
]
}
}

Tip

以下も参照してください。

ファイルへのパスでISODateを指定できます。 ファイル名にISODateが含まれているファイルの場合、Atlas Data Federation は 各ISODate用にパーティションを作成します。

次のフェデaccountingArchiveデータベースインスタンス ストアについて考えてみましょう。 このデータ ストアには、ファイル名にISODateが含まれるファイルが含まれています。

accountingArchive
|--invoices
|--01_02_2022_2301.json
|--02_02_2022_2301.json
|--03_02_2022_2301.json
|--04_02_2022_2301.json
|--05_02_2022_2301.json

次のdatabasesオブジェクトはISODate用のパーティションを作成します。 pathは、日付が RFC3339 にない場合に日付形式に正規表現を使用する方法を示しています。 形式。

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/creationDate isodate('01_02_2006_1504'):\\d{2}_\\d{2}_\\d{4}_\\d{4}.json"
}
]
}
]
}
]

サポートされている他の形式の詳細については、 「 パーティション属性タイプの使用 」を参照してください。

次のディレクトリ構造を持つフェデレーティッドデータベースインスタンス ストアaccountingArchiveについて考えます。

invoices
|--SuperSoftware
|--UltraSoftware
|--MegaSoftware

次のdatabasesオブジェクトは、ファイルパスから動的コレクション名を生成します。

"databases" : [
{
"name" : "invoices",
"collections" : [
{
"name" : "*",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{collectionName()}/"
}
]
}
]
}
]

サンプル ディレクトリ構造に適用すると、パスによって次のコレクションが生成されます。

  • スーパーソフトウェア

  • ultra ソフトウェア

  • メガソフトウェア

または、次のファイルを含むフェデレーティッドデータベースインスタンス ストアaccountingArchiveを検討してください。

/orders/MONGODB/invoices/January.json
/orders/MONGODB/purchaseOrders/January.json
/orders/MONGODB/invoices/February.json
...

次のdatabasesオブジェクトは、ファイルパスから動的コレクション名を生成します。

"databases" : [
{
"name" : "invoices",
"collections" : [
{
"name" : "*",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/orders/MONGODB/{collectionName()}/{invoiceMonth string}.json/"
}
]
}
]
}
]

サンプル ファイル名に適用すると、パスによって次のコレクションが生成されます。

  • invoices

  • purchaseOrders

注意

ファイル名からコレクションを動的に生成する場合、コレクション数は Data Federationビューで正確に報告されません。

戻る

コレクションの生成