当前位置: 首页 > 知识库问答 >
问题:

C#:筛选MongoDb集合

姚实
2023-03-14

我有以下问题:我正在学习如何使用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 Core2和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循环中,检索到的集合为空

共有1个答案

督冠玉
2023-03-14

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

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

 类似资料:
  • 我需要筛选此查询,以便不显示值为的文档。当前,我的代码显示以下结果: 我需要一些过滤器,使消失,以便它显示我作为第一个值:。 我以前执行过以下操作:

  • 基本上,我希望使用过滤泛型(扩展集合),然后返回相同泛型集合实现的实例(最好是新实例),例如实现方法签名。 null null null 修改原始列表

  • 这种情况非常简单,如ADFv2文档和示例中所述,我已经创建了一个复制管道来从MongoDB集合中获取数据,并将其写入AzureSQL数据库。 已成功传输完整采集数据,并且所有映射都已正确设置。当我试图过滤源数据集以仅从MongoDB获取最后n天时,问题就开始了。我尝试了几个查询,并与MongoDB Compass进行了交叉检查,以确定它们是否真的在执行Mongo-side,事实就是这样。归结起来就

  • 本文向大家介绍C ++中的按位筛选,包括了C ++中的按位筛选的使用技巧和注意事项,需要的朋友参考一下 在这个问题中,给我们一个数字N。我们的任务是使用按位筛选找到所有小于N的素数。 按位筛是Eratosthenes筛的优化版本,用于查找所有小于给定数的素数。 让我们举个例子来了解这个问题, 输入-N = 25 输出-2 3 5 7 11 13 17 19 23 按位筛子的工作方式与普通筛子相同。

  • 我有如下数据: 我希望在聚合中进行过滤(因为上面的数据来自前几个阶段),以便过滤一个数组,只显示一个数组项,其中用户等于_id。 以下返回空一个数组,如何让过滤器填充一个数组,因为我期望? 其中: 将“$\u id”替换为“$$un”。“用户”显示所有数据。其中一项与预期的一样,因此问题似乎出现在$eq语句中。 如何让过滤器显示一个数组,因为我期望?

  • 我想使用mongodb聚合匹配操作,通过字符串中多个嵌套对象的对象Id筛选mongodb集合。但是,在匹配操作中,spring data mongodb不会将字符串值转换为对象Id。 当Spring data mongodb将字符串值转换为oid时,我能够通过字符串值中的多个文档Id(主键,而不是嵌套对象的对象Id)过滤文档,没有任何问题: 我想要达到的目标如下: 但我总是得到以下信息: Spri