diff --git a/Tharga.Cache.MongoDB.Tests/MongoDBKeyFilterTests.cs b/Tharga.Cache.MongoDB.Tests/MongoDBKeyFilterTests.cs
new file mode 100644
index 0000000..ab161d7
--- /dev/null
+++ b/Tharga.Cache.MongoDB.Tests/MongoDBKeyFilterTests.cs
@@ -0,0 +1,68 @@
+using FluentAssertions;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using MongoDB.Bson;
+using MongoDB.Bson.Serialization;
+using MongoDB.Driver;
+using Moq;
+using Tharga.Cache.Core;
+using Tharga.MongoDB;
+using Xunit;
+using Sut = Tharga.Cache.MongoDB.MongoDB;
+
+namespace Tharga.Cache.MongoDB.Tests;
+
+///
+/// The cache key has to reach Mongo as an id, never as a filter document.
+///
+///
+/// DeleteOneAsync and UpdateOneAsync have no TKey overload, so a bare string is picked up by the
+/// FilterDefinition overload through the driver's implicit string -> JsonFilterDefinition conversion.
+/// That compiles cleanly and then fails at runtime, once per drop, with
+/// "JSON reader was expecting a value but found '<TypeName>'" - because CacheBase prefixes every
+/// key with the type name. Rendering the filter here is what tells the two apart.
+///
+public class MongoDBKeyFilterTests
+{
+ private const string CacheKey = "FeedStatusDto.my-feed-key";
+
+ private static BsonDocument Render(FilterDefinition filter)
+ {
+ return filter.Render(new RenderArgs(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry));
+ }
+
+ private static (Sut Sut, Mock Collection) BuildSut()
+ {
+ var collection = new Mock();
+
+ var collectionProvider = new Mock();
+ collectionProvider
+ .Setup(x => x.GetCollection(It.IsAny()))
+ .Returns(collection.Object);
+
+ var sut = new Sut(collectionProvider.Object, Mock.Of(), Options.Create(new MongoDBCacheOptions()), Mock.Of>());
+ return (sut, collection);
+ }
+
+ [Fact]
+ public async Task DropAsync_FiltersOnTheIdRatherThanParsingTheKeyAsJson()
+ {
+ var (sut, collection) = BuildSut();
+ FilterDefinition captured = null;
+ collection
+ .Setup(x => x.DeleteOneAsync(It.IsAny>(), It.IsAny>(), It.IsAny()))
+ .Callback, OneOption, IClientSessionHandle>((f, _, _) => captured = f)
+ .ReturnsAsync((CacheEntity)null);
+
+ await sut.DropAsync