基本介绍
在我们看到与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的最大好处之一:开发人员不需要了解前数据库方案,而可以在开发过程中修改动态方案。这在我们无法在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;
}