我有以下问题:我正在努力学习如何将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核心2和MongoDb c#驱动程序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循环中,检索的集合为空。
发布于 2018-01-16 11:26:37
当前的保存方式在文档的顶层创建了一个“请求”字段,该字段没有反映在实体结构中。为了解决这个问题,您不应该自己执行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
};
}那么你的检索也应该是有效的。
https://stackoverflow.com/questions/48279863
复制相似问题