Links
Access to a collection
var mongoClient = new MongoClient ("MONGODB_CONNECTION_STRING" );
var database = mongoClient.GetDatabase ("DB_NAME" );
var collection = database.GetCollection <MyClass >("COLLECTION_NAME" );
Dependency injection
Program.cs
builder.Services
.Configure <MongoConfiguration >(builder .Configuration .GetSection ("Mongo" ))
.AddSingleton <IMongoClient >(x =>
{
var mongoConfiguration = x .GetRequiredService <IOptions <MongoConfiguration >>().Value ;
var settings = MongoClientSettings.FromConnectionString (mongoConfiguration .ConnectionString );
settings.LinqProvider = LinqProvider.V3;
return new MongoClient (settings);
})
.AddSingleton (x =>
{
var client = x .GetRequiredService <IMongoClient >();
var configuration = x.GetRequiredService <IOptions <MongoConfiguration >>().Value ;
return client.GetDatabase (configuration .DatabaseName );
})
.AddSingleton (x =>
{
var database = x .GetRequiredService <IMongoDatabase >();
return database.GetCollection <MyCollection >(GetConfigurationValue ("MyCollectionName" ));
});
afficher MongoConfiguration.cs
public class MongoConfiguration
{
public string ConnectionString { get ; set ; } = string .Empty;
public string DatabaseName { get ; set ; } = string .Empty;
}
Find
Filter
var builder = Builders<MyClass>.Filter;
FilterDefinition <MyClass > filter = builder.Empty;
filter &= builder.Exists (x => x .Property1 );
filter &= builder.Eq (x => x .Property1 , "value" );
filter &= builder.In (x => x .Property1 , new [] { "value1" , "value2" });
var result = await collection
.Find (filter )
.SortByDescending (x => x .Property1 )
.Skip (100 )
.Limit (10 )
.ToListAsync ();
var result = (await collection.FindAsync (filter )).ToList ();
Handle different types
var bsonDocumentCollection = database.GetCollection <BsonDocument >("MyCollection" );
var filter = Builders<BsonDocument>.Filter.Empty;
var result = await bsonDocumentCollection.Find (filter ).ToListAsync ();
var class1Collection = database.GetCollection <Class1 >("MyCollection" );
await type1Collection.InsertOneAsync (new Class1 { Name = "Name1" });
var filter = Builders<Class1>.Filter.Eq (x => x .Type , nameof (Class1 ));
var filter = Builders<SimpleClass>.Filter.Exists (x => x .Name );
var result = await class1Collection.Find (filter ).ToListAsync ();
class Class1
{
public ObjectId Id { get ; set ; }
public string Name { get ; set ; } = string .Empty;
public string Type { get ; set ; } = nameof (Class1);
}
Pipeline
var stages = new BsonDocument []
{
MatchStage (getTimeSeriesQuery ),
ProjectionStage (),
SortStage ()
};
var pipeline = PipelineDefinition<InputClass, OutputClass>.Create (stages );
var results = (await myCollection.AggregateAsync (pipeline )).List ();
BsonDocument MatchStage (GetTimeSeriesQuery getTimeSeriesQuery )
{
var match = new BsonDocument ("property1" , "value1" );
if (!string .IsNullOrEmpty (variable2 ))
{
match.AddRange (
new BsonDocument ("property2" , variable2 )
);
}
return new BsonDocument ("$match" , match);
}
BsonDocument ProjectionStage () =>
new BsonDocument (
"$project" ,
new BsonDocument
{
{ "_id" , 0 },
{ "property1" , 1 },
{ "property2" , 1 }
}
);
BsonDocument SortStage () =>
new BsonDocument ("$sort" , new BsonDocument ("timestamp" , 1 ));
Insert / Update
await itemMongoCollection.InsertOneAsync (item );
FilterDefinition <Item > filter = Builders<Item>.Filter.Eq (nameod (Item .Id ), item.Id );
Item updatedItem = await itemMongoCollection.FindOneAndReplaceAsync (filter , item );
var options = new FindOneAndReplaceOptions <Item , T > { IsUpsert = true };
await itemMongoCollection.FindOneAndReplaceAsync (filter , item , options );
UpdateDefinitionBuilder <Item > updateBuilder = Builders<Item>.Update;
UpdateDefinition <Item > updateDefinition = Builders<Item>.Update.Combine (
updateBuilder .Set (nameof (Item .Name ), "updatedName "),
updateBuilder .Set (nameof (Item .Available ), false ));
UpdateResult result = await itemMongoCollection.UpdateOneAsync (filter , updateDefinition );
var success = result.ModifiedCount > 0 ;
var mongoUrl = new MongoUrl ("MONGODB_CONNECTION_STRING" );
var mongoClientSettings = MongoClientSettings.FromUrl (mongoUrl );
mongoClientSettings.ClusterConfigurator = cb =>
{
cb.Subscribe <CommandStartedEvent >(e =>
{
logger .LogTrace ($"{e .CommandName } - {e .Command .ToJson ()} " );
});
};
this .mongoClient = new MongoClient (mongoClientSettings);
Configure the Log so it will be displayed in Visual Studio Output Debug window.
Serialize a dictionary with an Enum as key
Error: An error occurred while serializing the Values property of class ...: When using DictionaryRepresentation.Document key values must serialize as strings
class MyClass
{
public ObjectId Id { get ; set ; }
public Dictionary <MyEnum , int > Values { get ; set ; } = [];
}
BsonSerializer.RegisterSerializer (new EnumSerializer <MyEnum >(BsonType .String ));
BsonDocument
var bsonDocument = BsonDocument.Parse (jsonDocument .RootElement .GetRawText ());
var bsonDocument = myObject.ToBsonDocument ();
bsonDocument["fieldName" ] = "value" ;