gpt4 book ai didi

c# - Keyset(Seek) 分页和 MongoDb 驱动程序 C#

转载 作者:行者123 更新时间:2023-12-04 08:29:27 24 4
gpt4 key购买 nike

我正在尝试使用 C# MongoDB 驱动程序通过键集/搜索分页对我的 MongoDB 结果进行分页。我不想使用偏移分页。
本质上,我有一个包含许多 tags 的数据库。 tag 的结构如下:

{
"_id" : ObjectId("5fc5cdb5d6ee08681d32d3ba"),
"UsageCount" : NumberLong(123456),
"Name" : "technology"
}

我想通过 UsageCount 属性按降序对我的数据库进行排序。此属性不是唯一的。许多 tags 可以具有相同的 UsageCount 值。示例结果将是:
[
{
"_id" : ObjectId("5fc5cdb5d6ee08681d32d3ba"),
"UsageCount" : NumberLong(9000),
"Name" : "technology"
},
{
"_id" : ObjectId("5fc5cdb5d6ee08681d32d3b1"),
"UsageCount" : NumberLong(8000),
"Name" : "technology"
},
{
"_id" : ObjectId("5fc5cdb5d6ee08681d32d3b2"),
"UsageCount" : NumberLong(7000),
"Name" : "technology"
},
...
]
示例 C# 代码:
// Get the mongo queryable
IMongoQueryable<Tag> tags = _mongoDbService.GetCollection<Tag>(nameof(Tag));

// Order the database descending by usage count
IOrderedMongoQueryable<Tag> orderedTags = tags.OrderByDescending(tag => tag.UsageCount);

// Take the tag after the tag with ID 5fc5cdb5d6ee08681d32d3b1
List<Tag> results = orderedTags.After("5fc5cdb5d6ee08681d32d3b1").Take(1).ToListAsync().ConfigureAwait(false);
这段代码的结果应该是一个列表,只包含上例中的最后一个标签:
{
"_id" : ObjectId("5fc5cdb5d6ee08681d32d3b2"),
"UsageCount" : NumberLong(7000),
"Name" : "technology"
}
这里的问题是上面代码中的After方法不存在。我希望以任何可用的方式实现相同的结果。
一些可能的解决方案可能是
  • 首先在排序后的文档列表中找到 5fc5cdb5d6ee08681d32d3b2 的索引,然后调用 skip(index) 。这需要两个查询,这不是很好,但更重要的是,我也不知道是否可以找到索引?
  • 找到一个等价于 After 的方法?
  • 其他?

  • 我看到这个问题问 before 没有解决方案。

    最佳答案

    您可以使用这样的聚合管道获得所需的结果:

    db.Tags.aggregate(
    [
    {
    $sort: { UsageCount: -1 }
    },
    {
    $group: {
    _id: null,
    tags: { $push: "$$ROOT" }
    }
    },
    {
    $set: {
    tags: {
    $slice: [
    "$tags",
    { $add: [{ $indexOfArray: ["$tags._id", ObjectId("5fc5cdb5d6ee08681d32d3b1")] }, 1] },
    { $size: "$tags" }]
    }
    }
    },
    {
    $unwind: "$tags"
    },
    {
    $replaceWith: "$tags"
    }
    ]
    )
    https://mongoplayground.net/p/uqmxl7cBCMA
    但是,将其转换为强类型的 c# 查询将非常困难(如果不是不可能的话)。看看这个 library用于运行上述复杂查询的替代方法。

    关于c# - Keyset(Seek) 分页和 MongoDb 驱动程序 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65096194/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com