Custom MigrateMap to sync by field or property, e.g. SKU
The map class doesn't (and shouldn't) know anything about either your source or your destination - its job is simply tracking the relationships between their keys.

I've done this in the migration's prepareRow(), doing an explicit lookup for a matching destination object, and if found saving that destination ID to the map and returning FALSE to prevent further processing. Look at how migrate_d2d maps user accounts based on email:

// On initial import, if this email address already exists, just map to the
// existing uid and don't allow it to be deleted. When updating, we can
// take the existing uid from the map instead of querying for it. Make sure
// when updating an imported user that we don't apply this logic.
if (empty($row-&gt;migrate_map_destid1)) {
  $new_uid = db_select('users', 'u')
             -&gt;fields('u', array('uid'))
             -&gt;condition('mail', $row-&gt;mail)
             -&gt;execute()
             -&gt;fetchField();
  // If we haven't mapped the admin account based on email address, map it
  // directly to the destination admin account.
  if (!$new_uid &amp;&amp; $row-&gt;uid == 1) {
    $new_uid = 1;
  }
}
elseif ($row-&gt;migrate_map_needs_update == MigrateMap::STATUS_IGNORED &amp;&amp;
        $row-&gt;migrate_map_rollback_action == MigrateMap::ROLLBACK_PRESERVE) {
  $new_uid = $row-&gt;migrate_map_destid1;
}

if (!empty($new_uid)) {
  $hash = isset($row-&gt;migrate_map_hash) ? $row-&gt;migrate_map_hash : NULL;
  $this-&gt;map-&gt;saveIDMapping($row, array($new_uid), MigrateMap::STATUS_IGNORED,
    MigrateMap::ROLLBACK_PRESERVE, $hash);
  $this-&gt;rollbackAction = MigrateMap::ROLLBACK_PRESERVE;
  return FALSE;
}