S3 データのパスの定義
項目一覧
Overview
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
に追加します。
サポートされている解析関数
ファイル名に単一の解析関数を指定できます。 |
| |
ファイル名に複数の解析関数を指定できます。 |
| |
ファイル名内の静的文字列と一緒に解析関数を指定できます。 |
| |
ドット( ファイル名へのパスにある . )の順にクリックします。 |
| |
パーティションを作成するファイルへのパスに ObjectIds を指定できます。 |
| |
パーティションを作成するファイルへのパスで、 ObjectIds の範囲を指定できます。 |
| |
ファイル名へのパスと一緒に解析関数を指定できます。 |
| |
ファイル名へのパスに応じて ISODate の正規表現を指定できます。 |
|
注意
path
を指定する場合
パーティション属性のデータ型を指定します。
パーティション属性の型が解析するデータ型と一致していることを確認します。
同じ型の属性を指定する場合は、以下のいずれかを行います。
属性の間に定数のセパレーターを追加します。
正規表現を使用して、検索パターンを記述します。 詳細については、「サポートされていない解析関数 」を参照してください。
ファイル名からの NULL 値の解析
は、ファイルパス内の属性の代わりに空のData Federation string( )を、""
BSON を除くすべてのAtlas Data Federation 属性タイプの null 値として自動的に解析します。string
string
を使用すると、空の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 がint
、 epoch_millis
、 epoch_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")
フィールドと invoiceNumber
invoiceDate
フィールドの 両方 を含むクエリは、指定された値に一致するファイルのみを対象にすることができます。
正規表現を使用してファイル名からフィールドを解析します
フェデレーティッドデータベースインスタンス ストア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 は パッケージ構文 をサポートしています ストレージ構成の正規表現用。
生成されたすべてのフィールドを含むクエリは、指定された値に一致するファイルのみを対象にすることができます。
ファイル名からクエリ可能なデータの範囲を識別する
フェデレーティッドデータベースインスタンス ストア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
フィールドのクエリは、 min
とmax
の日付を含め、指定された値をキャプチャする範囲のファイルのみを対象にすることができます。
重要
予期しない動作や望ましくない動作を避けるために、 ファイルに含まれるすべてのドキュメントに最小範囲と最大範囲に指定されたフィールドが存在する必要があります。 Data Federation は、基礎となるデータがこの制約に準拠しているかどうかの検証を実行しません。
ファイル名からネストされたフィールドを識別する
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を指定できます。 ファイル名に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
オブジェクトは、フィルタリングされたファイルの少数を含むinvoiceNumber
、 year
、 month
、 day
のパーティションを作成します。
"databases" : [ { "name" : "accounting", "collections" : [ { "name" : "invoices", "dataSources" : [ { "storeName" : "accountingArchive", "path" : "/invoices/{invoiceNumber string}/{year int}/{month int:\\d{2}}/{day int:\\d{2}}/*" } ] } ] } }
ISODate からのパーティションの作成
ファイルへのパスで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ビューで正確に報告されません。