How to atomically insert object into a dictionary field when key needs to be escaped

public class Ride {
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public Dictionary<Email, Passenger> Passengers { get; set; } = new();
}

public async Task<bool> Add(string rideId, Email user) {
        var addedToRide = await _userService.SetActiveRide(user, rideId);
        //var rideUpdate = Builders<Ride>.Update.Set($"Passengers.{user}", new Passenger());
        //var rideUpdate = Builders<Ride>.Update.Set(r => r.Passengers, new KeyValuePair<string, Passenger>(user, new Passenger()));
        // assume ride with id rideId exists
        var rideUpdate = Builders<Ride>.Update.Set(r => r.Passengers[user], new Passenger());
        var ride = await _ridesCollection.FindOneAndUpdateAsync<Ride>(r => r.Id == rideId,
                                                                      rideUpdate,
                                                                      new FindOneAndUpdateOptions<Ride> { ReturnDocument = ReturnDocument.After });
        // ride is null when it should've return something
        return ride.Passengers.ContainsKey(user); // errors at the moment
    }

I’ve spent hours and there’s little information on how to do this properly.

Example values for key “hey@gmail.com

The only way that works is

    [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
    public Dictionary<Email, Passenger> Passengers { get; set; } = new();

But I want to avoid doing this as I think k: v is better than {'k': k, 'v': v}