注意
ドキュメントを簡素化するために、このページで見つかった例はAWS S3 のデータ保存に基づいていますが、Google Cloud と Azure Private Link にも適用されます。
Overview
データ ストア内のドキュメントをクエリする場合、Atlas Data Federation path 値により、Data Federation はドキュメント内のデータをドキュメントのファイル名にマッピングできます。
path は、計算フィールドへのデータ ストアへのファイル名の解析をサポートしています。Data Federation は、 解析済みファイルから生成された各ドキュメントに計算フィールドを追加できます。Data Federation は、計算されたフィールド値に対するクエリの対象をファイル名が一致するファイルのみにすることができます。詳細については、サポートされている解析関数と例を参照してください。
path は、ファイルへのパスでパーティション属性を使用したパーティションの作成もサポートしています。 Data Federation は、パーティション属性で定義されたパラメーターに対するクエリの対象として、ファイル名またはパーティション プレフィックスにクエリが含まれるファイルのみを対象にできます。
例
S 3バケット内の次のファイルを検討します。
/users/26/1234.json /users/26/5678.json
JSONドキュメント1234.jsonには次の内容が含まれています。
{ "name": "jane doe", "age": 26, "userID": "1234" }
S 3バケット内のファイルのフェデレーティッドデータベースインスタンスの構成では、次の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を指定する場合
パーティション属性のデータ型を指定します。
パーティション属性の型が解析するデータ型と一致していることを確認します。
同じ型の属性を指定する場合は、以下のいずれかを行います。
属性の間に定数のセパレーターを追加します。
正規表現を使用して、検索パターンを記述します。詳細については、「サポートされていない解析関数」を参照してください。
ファイル名からの NULL 値の解析
Data Federation は、ファイルパス内の属性の代わりに空の文字列("")を、string を除くすべての Atlas Data Federation 属性タイプのBSON null 値として自動的に解析します。string を使用すると、空の文字列は BSON null 値または BSON 空の文字列値のいずれかを表すことができます。Atlas Data Federation は、string 属性タイプのBSON値を解析しません。これにより、データ保存から読み取られたドキュメントに競合するタイプのBSON値が追加されるのを回避できます。
例
次のS 3フェデレーティッドデータベースインスタンス ストアについて考えてみましょう。
/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.
注意
S 3にファイルを書き込む場合は、すべての Atlas Data Federation 属性タイプのファイル名に、 BSON null 値を空の文字列として書き込みます。
ファイル名からパディングされた数字の解析
ファイル パスには、先頭にゼロがある数値を含めることができます。 Data Federation がint 、 epoch_millis 、 epoch_secsなどの属性タイプの埋め込み数値を正しく解析するには、正規表現を使用して値の桁数を指定します。
例
次のファイルを含むS 3ストアについて考えてみましょう。
|--users |--001.json |--002.json ...
次のpath構文では、正規表現を使用してファイル名内の桁の数を指定します。 Data Federation は、パーティション属性に対応するパスの部分を識別し、そのパーティション属性をタイプintにマッピングします。
/users/{user_id int:\\d{3}}
サポートされていない解析関数
同じファイル名に対して、区別なしで連続した解析関数を指定すると、結果の整合性が失われる可能性があります。
例
次のファイルを含むS 3ストアについて考えてみましょう。
|--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 : 2019month: 01day: 02
重要
path で指定された正規表現文字列をエスケープする必要があります。 例、正規表現文字列に二重引用符が含まれている場合は、それらの値をエスケープする必要があります。 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 は、日付が RFC 3339形式でない場合に、日付形式に正規表現を使用する方法を示しています。
"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/" } ] } ] } ]
サンプル ファイル名に適用すると、パスによって次のコレクションが生成されます。
invoicespurchaseOrders
注意
ファイル名からコレクションを動的に生成する場合、コレクション数はData Federationビューに正確に報告されません。