C#MongoDB教程展示了如何在C#中对MongoDB进行编程。C#教程是C#语言的综合教程。
MongoDB
MongoDB是一个NoSQL跨平台的面向文档的数据库。它是可用的最流行的数据库之一。MongoDB由MongoDBInc.开发,并作为免费开源软件发布。
MongoDB中的记录就是文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可能包括其他文档、数组和文档数组。MongoDB将文档存储在集合中。集合类似于关系数据库中的表,文档类似于行。
MongoDB在后台以称为BSON
的二进制编码格式表示JSON
文档。BSON
扩展了JSON
模型以提供额外的数据类型、有序字段,并在不同语言中高效地进行编码和解码。.NETdriver使用BsonDocument
来表示BSON
。
MongoDB.Driver
MongoDB.Driver是MongoDB的官方.NET驱动程序。
$ dotnet add package MongoDB.Driver
我们需要将MongoDB.Driver
包添加到每个.NETCore项目中。
MongoDB创建数据库
mongo
工具是MongoDB的交互式JavaScriptshell接口,它为系统管理员提供了一个接口,也为开发人员提供了一种直接使用数据库测试查询和操作的方法。
$ mongo testdb MongoDB shell version v4.0.7 connecting to: mongodb://127.0.0.1:27017/testdb?gssapiServiceName=mongodb ... > db testdb > db.cars.insert({name: "Audi", price: 52642}) > db.cars.insert({name: "Mercedes", price: 57127}) > db.cars.insert({name: "Skoda", price: 9000}) > db.cars.insert({name: "Volvo", price: 29000}) > db.cars.insert({name: "Bentley", price: 350000}) > db.cars.insert({name: "Citroen", price: 21000}) > db.cars.insert({name: "Hummer", price: 41400}) > db.cars.insert({name: "Volkswagen", price: 21600})
我们创建一个testdb
数据库并在cars
集合中插入八个文档。我们将在教程中使用这些数据。
C#MongoDB列表数据库
第一个示例连接到MongoDB服务器并检索其数据库。
using MongoDB.Driver; using MongoDB.Bson; namespace SimpleEx { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); var dbList = dbClient.ListDatabases().ToList(); Console.WriteLine("The list of databases are:"); foreach (var item in dbList) { Console.WriteLine(item); } } } }
该示例连接到MongoDB服务器并检索其所有数据库。
var dbClient = new MongoClient("mongodb://127.0.0.1:27017");
MongoClient
类用于连接到MongoDB服务器。27017是MongoDB服务器默认监听的端口。
var dbList = dbClient.ListDatabases().ToList();
我们使用ListDatabases
方法获取数据库列表。
foreach (var item in dbList) { Console.WriteLine(item); }
我们遍历列表并打印项目。
$ dotnet run The list of databases are: { "name" : "admin", "sizeOnDisk" : 32768.0, "empty" : false } { "name" : "config", "sizeOnDisk" : 86016.0, "empty" : false } { "name" : "local", "sizeOnDisk" : 81920.0, "empty" : false } { "name" : "test", "sizeOnDisk" : 212992.0, "empty" : false } { "name" : "testdb", "sizeOnDisk" : 155648.0, "empty" : false }
C#MongoDB运行命令
RunCommand
方法在数据库上运行一个命令。
using MongoDB.Driver; using MongoDB.Bson; namespace MongoCommand { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var command = new BsonDocument { { "dbstats", 1 } }; var result = db.RunCommand<BsonDocument>(command); Console.WriteLine(result.ToJson()); } } }
该示例连接到testdb数据库并获取其统计信息。
IMongoDatabase db = dbClient.GetDatabase("testdb");
我们使用GetDatabase
方法获取数据库。
var command = new BsonDocument { { "dbstats", 1 } }; var result = db.RunCommand<BsonDocument>(command);
使用RunCommand
方法,我们执行dbstats
命令。该命令返回一个文档,该文档表示MongoDB文档。
Console.WriteLine(result.ToJson());
我们将文档以JSON格式打印到控制台。
$ dotnet run { "db" : "testdb", "collections" : 3, "views" : 0, "objects" : 15, "avgObjSize" : 57.0, "dataSize" : 855.0, "storageSize" : 77824.0, "numExtents" : 0, "indexes" : 3, "indexSize" : 77824.0, "fsUsedSize" : 160688828416.0, "fsTotalSize" : 254721126400.0, "ok" : 1.0 }
C#MongoDB查找文档
我们查询具有特定过滤器的文档。过滤器被提供给Find
方法,该方法查找应用给定过滤器的文档。
using MongoDB.Driver; using MongoDB.Bson; namespace FindDocument { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var filter = Builders<BsonDocument>.Filter.Eq("price", 29000); var doc = cars.Find(filter).FirstOrDefault(); Console.WriteLine(doc.ToString()); } } }
该示例查找包含价格为29000的汽车的文档。
var cars = db.GetCollection<BsonDocument>("cars");
我们使用GetCollection
方法获取cars
集合。
var filter = Builders<BsonDocument>.Filter.Eq("price", 29000);
一个过滤器被创建;我们找一辆价格等于29000的车。
var doc = cars.Find(filter).FirstOrDefault();
我们将过滤器传递给Find
方法并使用FirstOrDefault
方法检索它。
$ dotnet run { "_id" : ObjectId("5d4d1408463315268eb7376e"), "name" : "Volvo", "price" : 29000.0 }
C#MongoDB查找所有文档
如果我们不为Find
方法指定过滤条件,我们将获取所有文档。
using MongoDB.Driver; using MongoDB.Bson; namespace FindAll { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var documents = cars.Find(new BsonDocument()).ToList(); foreach (BsonDocument doc in documents) { Console.WriteLine(doc.ToString()); } } } }
该示例从cars
集合中检索所有文档。
$ dotnet run { "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 } { "_id" : ObjectId("5d4d13f5463315268eb7376c"), "name" : "Mercedes", "price" : 57127.0 } { "_id" : ObjectId("5d4d1408463315268eb7376e"), "name" : "Volvo", "price" : 29000.0 } { "_id" : ObjectId("5d4d140d463315268eb7376f"), "name" : "Bentley", "price" : 350000.0 } { "_id" : ObjectId("5d4d1411463315268eb73770"), "name" : "Citroen", "price" : 21000.0 } { "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 } { "_id" : ObjectId("5d4d1419463315268eb73772"), "name" : "Volkswagen", "price" : 21600.0 }
我们得到了所有七个文档。
C#MongoDB查询
Mongo支持多种查询过滤运算符,例如Gt
、Lt
或Gte
。
using MongoDB.Driver; using MongoDB.Bson; namespace MongoQuery { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var builder = Builders<BsonDocument>.Filter; var filter = builder.Gt("price", 30000) & builder.Lt("price", 55000); var docs = cars.Find(filter).ToList(); docs.ForEach(doc => { Console.WriteLine(doc); }); } } }
该示例打印汽车价格在30000到55000之间的所有文档。
var filter = builder.Gt("price", 30000) & builder.Lt("price", 55000);
我们使用两个运算符构建过滤器:Gt
和Lt
。
$ dotnet run { "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 } { "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }
我们找到了两个符合条件的文档。
C#MongoDB插入文档
使用InsertOne
方法将新文档插入到集合中。
using MongoDB.Driver; using MongoDB.Bson; namespace InsertDocument { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var doc = new BsonDocument { {"name", "BMW"}, {"price", 34621} }; cars.InsertOne(doc); } } }
该示例将一个新的汽车文档插入到cars
集合中。
var doc = new BsonDocument { {"name", "BMW"}, {"price", 34621} };
创建了一个新的BsonDocument
。
cars.InsertOne(doc);
使用InsertOne
方法将文档插入到集合中。
C#MongoDB跳过和限制
limit
查询选项指定要返回的文档数,skip
选项跳过指定数量的文档。
using MongoDB.Driver; using MongoDB.Bson; namespace LimitSkip { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var docs = cars.Find(new BsonDocument()).Skip(3).Limit(3).ToList(); docs.ForEach(doc => { Console.WriteLine(doc); }); } } }
该示例从testdb.cars
集合中读取,跳过前三个文档,并将输出限制为三个文档。
$ dotnet run { "_id" : ObjectId("5d4d140d463315268eb7376f"), "name" : "Bentley", "price" : 350000.0 } { "_id" : ObjectId("5d4d1411463315268eb73770"), "name" : "Citroen", "price" : 21000.0 } { "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400.0 }
输出包含三个文档。
C#MongoDB投影
投影确定哪些字段将包含在查询输出中。
using MongoDB.Driver; using MongoDB.Bson; namespace Projections { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var docs = cars.Find(new BsonDocument()).Project("{_id: 0}").ToList(); docs.ForEach(doc => { Console.WriteLine(doc); }); } } }
在示例中,我们找到了所有文档。我们从输出中排除了_id
。
$ dotnet run { "name" : "Audi", "price" : 52000 } { "name" : "Mercedes", "price" : 57127.0 } { "name" : "Volvo", "price" : 29000.0 } { "name" : "Bentley", "price" : 350000.0 } { "name" : "Citroen", "price" : 21000.0 } { "name" : "Hummer", "price" : 41400.0 } { "name" : "Volkswagen", "price" : 21600.0 }
文档的输出不包含_id
字段。
C#MongoDB删除文件
使用deleteOne
方法删除文档。
using MongoDB.Driver; using MongoDB.Bson; namespace DeleteDocument { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var filter = Builders<BsonDocument>.Filter.Eq("name", "BMW"); cars.DeleteOne(filter); } } }
该示例删除了汽车名称为BMW的文档。
C#MongoDB更新文档
使用UpdateOne
方法更新文档。
using MongoDB.Driver; using MongoDB.Bson; namespace UpdateDocument { class Program { static void Main(string[] args) { var dbClient = new MongoClient("mongodb://127.0.0.1:27017"); IMongoDatabase db = dbClient.GetDatabase("testdb"); var cars = db.GetCollection<BsonDocument>("cars"); var filter = Builders<BsonDocument>.Filter.Eq("name", "Audi"); var update = Builders<BsonDocument>.Update.Set("price", 52000); cars.UpdateOne(filter, update); } } }
该示例更新名称为Audi的汽车文档。它为此文件设定了新的价格。
cars.UpdateOne(filter, update);
UpdateOne
方法采用过滤器来查找确切的文档和更新操作以执行实际更改。
在本文中,我们在C#中使用了MongoDB。
列出所有C#教程。