我有以下问题:我正在尝试学习如何将MongoDb与c#一起使用。我能够在集合中插入项目,但我无法过滤现有集合以检索满足查询条件的一个或多个项目。这是我的班级结构:
public class TransactionRequest
{
public Header Header { get; set; }
public Transaction Transaction { get; set; }
}
public class Header
{
public string BusinessId { get; set; }
}
public class Transaction
{
public string Id { get; set; }
public string Status { get; set; }
}
以下是我保存对象的方法:
public async Task<TransactionResponse> SaveAsync(TransactionRequest request)
{
var document = new BsonDocument
{
{"Request", BsonValue.Create(JsonConvert.SerializeObject(request))}
};
await this._mongoClient.GetDatabase("MyDatabase").GetCollection<BsonDocument>("Transactions").InsertOneAsync(document, null, CancellationToken.None);
return new TransactionResponse
{
InternalId = document["_id"].ToString(),
TransactionId = request.Transaction.Id
};
}
正确保存对象,如下图所示:
但是如何检索包含ID为1234的对象事务的文档?
我使用的是.net core 2和MongoDb c#driver version 2.5。
编辑:该集合是一个BsonDocument集合,它不是Transactionrequest类型的集合,那么如何将字段id映射到该bson文档? 编辑2:以下是我尝试检索文档的方式:
public async Task<string> RetrieveResponse(string id)
{
var cursor =await this.mongoClient.GetDatabase("MyDatabase")
.GetCollection<TransactionRequest>("Transactions")
.FindAsync(t => t.Transaction.Id.Equals("1234"));
while (await cursor.MoveNextAsync())
{
IEnumerable<TransactionRequest> documents = cursor.Current;
Console.WriteLine(documents.Count()); //this is empty
}
return string.Empty;
}
但是在while循环中,检索到的集合是空的
答案 0 :(得分:0)
您当前的保存方式会在文档的顶层创建一个“请求”字段,该字段不会反映在您的实体结构中。为了解决这个问题,你不应该自己做JSON转换,而是让驱动程序为你做这些:
public async Task<TransactionResponse> SaveAsync(TransactionRequest request)
{
await this._mongoClient.GetDatabase("MyDatabase")
.GetCollection<TransactionRequest>("Transactions")
.InsertOneAsync(request, null, CancellationToken.None);
// load document - not needed, just for illustration purposes
this._mongoClient.GetDatabase("MyDatabase")
.GetCollection<TransactionRequest>("Transactions")
.Find(t => t.Transaction.Id == request.Transaction.Id);
return new TransactionResponse
{
InternalId = request.Id,
TransactionId = request.Transaction.Id
};
}
然后你的检索也应该有用。