c#:过滤MongoDb集合

时间:2018-01-16 11:10:17

标签: c# mongodb mongodb-query

我有以下问题:我正在尝试学习如何将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
            };
        }

正确保存对象,如下图所示:

inserted record

但是如何检索包含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循环中,检索到的集合是空的

1 个答案:

答案 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
    };
}

然后你的检索也应该有用。