【问题标题】:c#: Filter MongoDb collectionc#: 过滤 MongoDb 集合
【发布时间】:2018-01-16 11:10:16
【问题描述】:

我有以下问题:我正在尝试学习如何将 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# 驱动程序版本 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循环里面,检索到的集合是空的

【问题讨论】:

  • MongoDB and C# Find()的可能重复
  • 我已经看过那里的代码,但是如何将字段 id 从事务对象映射到我在集合中拥有的 BsonDocument?

标签: c# mongodb mongodb-query


【解决方案1】:

您当前的保存方式会在文档的顶层创建一个“请求”字段,该字段不会反映在您的实体结构中。为了解决这个问题,您不应该自己进行 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
    };
}

那么你的检索也应该起作用了。

【讨论】:

  • 但我的问题是当我尝试检索某个文档时。我试图像这样检索它:
  • var cursor = await this.mongoClient.GetDatabase("MyDatabase") .GetCollection("Transactions") .FindAsync(t => t.Transaction.Id.Equals("1234") ); while (await cursor.MoveNextAsync()) { IEnumerable 文档 = cursor.Current; Console.WriteLine(documents.Count()); }
  • 但是在while循环里面,文档集合是空的
  • 你的交易ID是字符串吗?如果没有尝试.Find(tr =&gt; tr.Transaction.Id.Equals(1234))
  • Id 是一个字符串。我已经尝试过 .FindAsync(t => t.Transaction.Id.Equals("1234"))。但它不起作用。我需要异步阅读此文档。但是这会返回一个 IAsyncCursor 并且这个游标是空的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2020-03-21
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多