ok

alphons <alphons@heijden.com> 2 Sep 2024, 09:57
ccf1cdc4d146ddec988791f16a5e740a3b351d19
4 files changed
  • src/MongoEfCore/MongoEfCore.csproj
  • src/MongoEfCore/MongoExtensions.cs
  • src/MongoEfCore/MyDbContext.cs
  • src/MongoEfCore/Program.cs
diff --git a/src/MongoEfCore/MongoEfCore.csproj b/src/MongoEfCore/MongoEfCore.csproj
index a040da0..a604dff 100644
--- a/src/MongoEfCore/MongoEfCore.csproj
+++ b/src/MongoEfCore/MongoEfCore.csproj
@@ -8,11 +8,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="MongoDB.EntityFrameworkCore" Version="8.1.0" />
- </ItemGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\BsonExtensions\BsonExtensions.csproj" />
+ <PackageReference Include="MongoDB.Driver" Version="2.28.0" />
</ItemGroup>
</Project>
diff --git a/src/MongoEfCore/MongoExtensions.cs b/src/MongoEfCore/MongoExtensions.cs
new file mode 100644
index 0000000..2401720
--- /dev/null
+++ b/src/MongoEfCore/MongoExtensions.cs
@@ -0,0 +1,32 @@
+using MongoDB.Driver;
+
+using System.Linq.Expressions;
+
+
+namespace MongoEfCore
+{
+ public static class MongoExtensions
+ {
+ public static IFindFluent<T, T>? Where<T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> filter)
+ {
+ return collection.Find(filter);
+ }
+
+ public static T? FirstOrDefault<T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> filter)
+ {
+ var results = collection.Find(filter);
+
+ return results.FirstOrDefault();
+ }
+
+ public async static Task<T?> FirsOrDefaultAsync<T>(this IMongoCollection<T> collection, Expression<Func<T, bool>> filter)
+ {
+ var results = await collection.FindAsync(filter);
+
+ if (results == null)
+ return default;
+ else
+ return await results.FirstOrDefaultAsync();
+ }
+ }
+}
diff --git a/src/MongoEfCore/MyDbContext.cs b/src/MongoEfCore/MyDbContext.cs
deleted file mode 100644
index 26fbc3c..0000000
--- a/src/MongoEfCore/MyDbContext.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using MongoDB.Bson;
-using MongoDB.Bson.Serialization.Attributes;
-using MongoDB.Driver;
-using MongoDB.EntityFrameworkCore.Extensions;
-
-
-namespace MongoEfCore;
-
-public class MyDbContext : DbContext
-{
- public DbSet<Movie> Movies { get; init; }
- public static MyDbContext Create(IMongoDatabase database) =>
- new(new DbContextOptionsBuilder<MyDbContext>()
- .UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
- .Options);
- public MyDbContext(DbContextOptions options) : base(options)
- {
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- base.OnModelCreating(modelBuilder);
- modelBuilder.Entity<Movie>().ToCollection("movies");
- }
-}
-public class Movie
-{
- [BsonId]
- public ObjectId _id { get; set; }
- [BsonElement("title")]
- public string Title { get; set; }
- [BsonElement("rated")]
- public string Rated { get; set; }
- [BsonElement("plot")]
- public string Plot { get; set; }
-}
diff --git a/src/MongoEfCore/Program.cs b/src/MongoEfCore/Program.cs
index 499d212..f987215 100644
--- a/src/MongoEfCore/Program.cs
+++ b/src/MongoEfCore/Program.cs
@@ -1,76 +1,114 @@

-using BsonExtensions;
-using Microsoft.EntityFrameworkCore;
using MongoDB.Driver;
using MongoDB.Bson;
-using MongoEfCore;
using System.Diagnostics;
+using MongoEfCore;
+
var connectionString = "mongodb://192.168.28.123:27017";
-if (1 == 1)
-{
- var sw1 = Stopwatch.StartNew();
- var settings = MongoClientSettings.FromConnectionString($"{connectionString}");
+var sw1 = Stopwatch.StartNew();
- settings.ServerSelectionTimeout = TimeSpan.FromSeconds(1);
+//var settings = MongoClientSettings.FromConnectionString($"{connectionString}");
- var dbClient = new MongoClient(settings);
+//settings.ServerSelectionTimeout = TimeSpan.FromSeconds(1);
- var movies = dbClient?.GetDatabase("testdb1").GetCollection<Movie>("movies");
+var dbClient = new MongoClient(connectionString);
- var aaa1 = movies.FirstOrDefault(x => x._id == ObjectId.Parse("66d48adca720951e07550d78"));
+if (dbClient == null)
+ return;
- var aaa2 = await movies.Where(x => x._id ==ObjectId.Parse("66d48adca720951e07550d78")).FirstOrDefaultAsync();
+var movies = dbClient.GetDatabase("testdb3").GetCollection<Movie>("cmovies");
- var aaa3 = await movies.FirsOrDefaultAsync(x => x._id == ObjectId.Parse("66d48adca720951e07550d78"));
+if (movies == null)
+ return;
- for (int i = 0; i < 1000; i++)
- {
- await movies.FirsOrDefaultAsync(x => x._id == ObjectId.Parse("66d48adca720951e07550d78"));
- }
+//var indexKeysDefinition = Builders<Movie>.IndexKeys.Ascending(x => x.Title);
+//await movies.Indexes.CreateOneAsync(new CreateIndexModel<Movie>(indexKeysDefinition));
- var movie1 = await movies.FirsOrDefaultAsync(x => x._id == ObjectId.Parse("66d48adca720951e07550d78"));
+//for (int i = 0; i < 10000; i++)
+//{
+// await movies.InsertOneAsync(new Movie()
+// {
+// Title = $"This is movie {i}",
+// Plot = "This plot is unknown",
+// Rated = "1"
+// });
+//}
- Console.WriteLine($"{sw1.ElapsedMilliseconds}mS {movie1.Title}");
+//var mmm = new Movie()
+//{
+// Title = "Unknown",
+// Plot = "This plot is unknown",
+// Rated = "1"
+//};
- return;
-}
+//await movies.InsertOneAsync(mmm);
-//====================================
-var sw2 = Stopwatch.StartNew();
+movies.FirstOrDefault(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087"));
+sw1.Restart();
-var client = new MongoClient(connectionString);
+var aaa1 = movies.FirstOrDefault(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087"));
-var db = MyDbContext.Create(client.GetDatabase("testdb1"));
+Console.WriteLine($"{sw1.ElapsedMilliseconds}mS");
-//db.Database.EnsureCreated();
+sw1.Restart();
-for (int i = 0; i < 1000; i++)
-{
- await db.Movies.AsNoTracking().FirstOrDefaultAsync(m => m._id == ObjectId.Parse("66d48adca720951e07550d78"));
-}
-var movie2 = await db.Movies.AsNoTracking().FirstOrDefaultAsync(m => m._id == bjectId.Parse("66d48adca720951e07550d78"));
+var aaa2 = await movies.Where(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087")).FirstOrDefaultAsync();
+
+Console.WriteLine($"{sw1.ElapsedMilliseconds}mS");
+
+sw1.Restart();
+
+var aaa3 = movies.Where(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087")).FirstOrDefault();
+
+Console.WriteLine($"Sync {sw1.ElapsedMilliseconds}mS");
+
+var aaa4 = await movies.FirsOrDefaultAsync(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087"));
-Console.WriteLine($"{sw2.ElapsedMilliseconds}mS {movie2.Title}");
+Console.WriteLine($"{sw1.ElapsedMilliseconds}mS");
-//if(movie == null)
+sw1.Restart();
+
+var aaa5 = movies.FirstOrDefault(x => x.Title == "This is movie 5432");
+
+Console.WriteLine($"{sw1.ElapsedMilliseconds}mS");
+
+sw1.Restart();
+
+var a = await movies.CountDocumentsAsync(x => x.Title == "Unknown");
+
+Console.WriteLine($"{sw1.ElapsedMilliseconds}mS");
+
+
+//for (int i = 0; i < 1000; i++)
//{
-// movie = new Movie()
-// {
-// Title = "Back to the Future",
-// Rated = "9",
-// Plot = "people in the past going to the future"
-// };
-// db.Movies.Add(movie);
-// var status = await db.SaveChangesAsync();
+// await movies.FirsOrDefaultAsync(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087"));
//}
-//Console.WriteLine(movie.Plot);
+
+var movie1 = await movies.FirsOrDefaultAsync(x => x.Id == ObjectId.Parse("66d5653d643b92e1eb73b087"));
+
+if(movie1 != null)
+ Console.WriteLine($"{sw1.ElapsedMilliseconds}mS {movie1.Title}");
+
+
+
+
+class Movie
+{
+ public ObjectId Id { get; set; }
+
+ public string? Title { get; set; }
+
+ public string? Rated { get; set; }
+
+ public string? Plot { get; set; }
+}