将MongoDB与C#E .NET Core一起使用
#网络开发人员 #初学者 #csharp #mongodb

基本介绍

在我们看到与c#e .net一起使用mongoDB的所有不同方法之前,让我们检查一下此数据库的一些基本概念。

* 文档 *

mongoDB是一个banco de dados orientado a documentos,与关系数据库具有某些相似之处。

而不是线,MongoDB具有documentos。在关系数据库的亲戚中,特定记录的信息分散在整个表中,特定记录的所有数据都存储在文档中。

此时,文档是BSON文件,是JSON文件的编码序列化。但是,从程序员的角度来看,MongoDB处理JSON PUOS文件。

MongoDB文档的示例:

{
  _id: ObjectId("5099803df3f4948bd2f98391"),
  name: { first: "Alan", last: "Turing" },
  birth: new Date('Jun 23, 1912'),
   death: new Date('Jun 07, 1954'),
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   views : NumberLong(1250000)
}

如何看到:

使用此文档JSON的使用中有一个_id字段。
该字段是独家的,由MongoDB为数据库中的每个文档生成。

中的每个文档。 因此,MongoDB保持关系数据库的重要属性之一 - Forte一致性。

收藏

文档存储在集合中。

收集是某种方式相关文档组,但是这些文档不必具有相同的结构。

这是MongoDB的最大好处之一:开发人员不需要了解前数据库方案,而可以在开发过程中修改动态方案。这在我们无法在Innio中正确或涵盖许多极端情况的系统中特别好。

。 此外,避免了阻抗不兼容的整个问题(即消除对象报告的映射层)。

这怎么样?

假设上一个文档存储在名为Koud1的集合中;我们可以在此集合中添加另一个文档,该文档将包含以前文档没有的字段,或者我们可以添加一个文档,该文档可能没有上一位文档的字段。

使用上一个示例,我们可以将下一个文档添加到集合:

{
  _id: ObjectId("5099803df3f4948bd2f98391"),
  name: { first: "Alan", last: "Turing" },
  birth: new Date('Jun 23, 1912'),
   death: new Date('Jun 07, 1954'),
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   views : NumberLong(1250000)
}
{
  _id: ObjectId("5099803df3f4948bd2f98391"),
  name: { first: "Alan", last: "Turing" },
  birth: new Date('Jun 23, 1912'),
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   views : NumberLong(1250000),
  location: [99, 99]
}
如您所见,这些文档是相似的,但不相等。新文档包含death字段,但包含先前添加的文档具有的附加location字段。

对象的BSON映射C#强烈键入

当我们使用driver .NET时,我们通过BsonDocument消费文档。我们要做的是将这些Bsondocuments映射到强大的对象。但是在此之前,让我们看看我们的数据库及其实体是如何的。

数据库示例

我们将使用一个名为-blog的数据库。

此数据库具有一个集合posts,其中包含每个帖子的文档。

单个帖子的JSON文档将是这样的:

  {
    "_id": ObjectID("64d238115d06bc53ce5c4606"),
    "title": "title",
    "summary": "summary",
    "content": "content",
  "Author": Object
  "UpdatedAt": 2023-08-08T12:41:53.163+00:00
  "CreatedAt": 2023-08-08T12:41:53.163+00:00
  },

等效于c

在C#中的等效物具有以下外观:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace MongoDb
{
 public class Post
 {
  [BsonId]
  [BsonRepresentation(BsonType.ObjectId)]
  public string Id { get; set; }
  [BsonElement("title")]
  public string Title { get; set; }
  [BsonElement("summary")]
  public string Summary { get; set; }
  [BsonElement("author")]
  public User Author { get; set; }
  [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
   public DateTime CreatedAt { get; } = DateTime.Now;
   [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
   public DateTime UpdatedAt { get; set; } = DateTime.Now;
 }
}

explicaã§o

您将意识到此类每个属性都有属性。这些属性允许我们自动映射我们类的BSondocument数据。

BsonId用于映射独家文档标识符。 MongoDB的每个文档都有一个元素:

ObjectId.BsonElement(field_name)

您的类型用于在对象的属性中映射对象的其他字段。

我们知道,文档数据库不是一个粗鲁的方案,JSON文档中可能拥有比我们在应用程序中真正使用的更多字段。

另外,我们可能不想列入所有数据库字段。为此,我们可以使用

BsonIgnoreExtraElements

在自己的班级中。

后存储库

目标是创建一个类,该类将使我们能够在posts的集合中进行简单的原始操作。

我们需要做的第一件事是从应用程序连接到数据库。做到这一点的最幻想的方法是使用MongoClient类,通过driver MongoDB处置。 (您的构建器需要一个连接字符串)。

我们需要使用的其他类是MongoDatabase,用于访问定义的数据库(在这种情况下为博客)和MongoCollection,以访问定义的集合(在这种情况下为帖子)。

查看代码中的内容:

public class PostsRepository
{
    private IMongoClient _client;
    private IMongoDatabase _database;
    private IMongoCollection<Post> _postsCollection;

    public PostsRepository(string connectionString)
    {
        _client = new MongoClient(connectionString);
        _database = _client.GetDatabase("blog");
        _postsCollection = _database.GetCollection<Post>("posts");
    }
}

创建帖子

遵循以前的步骤时,数据库中文档的插入是幻想的:

public async Task InsertPost(Post post)
{
    await _postsCollection.InsertOneAsync(post);
}

显然,我使用了assãncronaInsertOneAsync的经纪人,但是您也可以使用sancrona操作。

再次,当我们在post属性上绘制JSON字段时,使用这些突击操作是幻想的。

Listar帖子

发布列表如下:

public async Task<List<Post>> GetAllPosts()
{
    return await _postsCollection.Find(new BsonDocument()).ToListAsync();
}

public async Task<List<Post>> GetPostsByField(string fieldName, string fieldValue)
{
    var filter = Builders<Post>.Filter.Eq(fieldName, fieldValue);
    var result = await _usersCollection.Find(filter).ToListAsync();

    return result;
}

public async Task<List<Post>> GetPost(int startingFrom, int count)
{
    var result = await _postsCollection.Find(new BsonDocument())
                                       .Skip(startingFrom)
                                       .Limit(count)
                                       .ToListAsync();

    return result;
}

此功能只有不同的实现。让我们检查一下。

在第一个中,koud10函数返回所有数据库帖子。

为此,我们使用Koud11 Koud11 Mother12并将空的Bsondocument传递给他。
在下一个方面,GetPostsByField,我们可以看到母亲©All Find接收到过滤器对象,该对象将用作获取数据的标准。

在第一个Funa中,我们使用一个空过滤器,因此接收了集合的所有用途。

在第二个功能中,我们使用koud15创建将在数据库中使用的过滤器。

最后,最后一个功能-GetPosts-使用Mongocollection的母亲Koud17和Limit来获得必要的数据pedaão。该最后一个功能可用于页面。

更新帖子

文档可以以类似的方式更新:

public async Task<bool> UpdatePost(ObjectId id, string updateFieldName, string updateFieldValue)
{
    var filter = Builders<Post>.Filter.Eq("_id", id);
    var update = Builders<Post>.Update.Set(updateFieldName, updateFieldValue);

    var result = await _postsCollection.UpdateOneAsync(filter, update);

    return result.ModifiedCount != 0;
}

一个有趣的事实是,使用此功能,您可以添加不在“架构”中的字段。例如,如果要向post文档添加新字段,则可以执行此操作:

var posts = await _mongoDbRepo.GetPostsByField("title", "title test");
var post = posts.FirstOrDefault();
var result = await _mongoDbRepo.UpdatePost(post.Id, "coverImageUrl", "url.com");
因此,使用了模块化方案的蒙哥多(和其余文档数据库)。您不会被定义的对象阻止,并且可以在必要时存储动态信息。

删除帖子

可以通过这种方式删除帖子:

public async Task<bool> DeletePostById(ObjectId id)
{
    var filter = Builders<Post>.Filter.Eq("_id", id);
    var result = await _postsCollection.DeleteOneAsync(filter);
    return result.DeletedCount != 0;
}

public async Task<long> DeleteAllPosts()
{
    var filter = new BsonDocument();
    var result = await _postsCollection.DeleteManyAsync(filter);
    return result.DeletedCount;
}
简而资源。证明了最常用的操作的CRUD操作的用途。