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#教程。
