# findMatchingDataSets

> **findMatchingDataSets**(`dataSets`, `metadata`, `legacyPieceStorageIdLimit?`): [`SelectionDataSet`](/reference/filoz/synapse-core/warm-storage/interfaces/selectiondataset/)[]

Defined in: [packages/synapse-core/src/warm-storage/find-matching-data-sets.ts:55](https://github.com/FilOzone/synapse-sdk/blob/234c88138c538ba9541243bf741aec6a41d402f0/packages/synapse-core/src/warm-storage/find-matching-data-sets.ts#L55)

Find datasets matching the given metadata, sorted by preference.

Matching is exact: a dataset matches only if its metadata keys and
values are identical to the requested metadata.

Only active datasets are considered (live, managed, pdpEndEpoch === 0n).

Sort order:
  1. Compact datasets (dataSetId >= legacyPieceStorageIdLimit) before legacy ones
  2. Within each group, datasets with pieces before empty datasets
  3. Within each group, older datasets (lower ID) first

## Parameters

| Parameter | Type | Default value | Description |
| ------ | ------ | ------ | ------ |
| `dataSets` | [`SelectionDataSet`](/reference/filoz/synapse-core/warm-storage/interfaces/selectiondataset/)[] | `undefined` | Datasets to search (typically filtered to a single provider) |
| `metadata` | [`MetadataObject`](/reference/filoz/synapse-core/utils/type-aliases/metadataobject/) | `undefined` | Desired metadata keys and values |
| `legacyPieceStorageIdLimit` | `bigint` | `0n` | Data set ID boundary between legacy and compact piece storage (see `FilecoinChain.legacyPieceStorageIdLimit`). Defaults to 0n, which treats every dataset as compact. |

## Returns

[`SelectionDataSet`](/reference/filoz/synapse-core/warm-storage/interfaces/selectiondataset/)[]

Matching datasets in preference order