You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# MongoDB .NET Driver对文档内animals数组字段实现分页

C# MongoDB .NET Driver 数组分页查询实现方案

你的问题核心是$slice操作符的使用位置错误:该操作符属于投影配置,不属于查询过滤条件,你把它放在查询参数里自然不会生效。

修改后的实现代码(原生Bson写法)

// 1. 仅把id匹配条件放在查询过滤器中
var filter = new BsonDocument("id", id);
// 2. 单独配置投影,使用$slice控制animals数组的截取规则
var projection = new BsonDocument
{
    { "id", 1 },
    { "name", 1 },
    { "animals", new BsonDocument("$slice", new BsonArray { 0, 3 }) }
};
// 3. 查询时传入投影配置
var result = await collection.Find(filter)
    .Project(projection)
    .FirstOrDefaultAsync();
return result;

如果需要做分页偏移,比如要取第2页的3条数据,只需要把$slice的参数修改为[3, 3]即可,第一个参数是起始下标,第二个是截取长度。

强类型推荐写法(避免硬编码字段)

如果你定义了对应文档的实体类:

public class UserDocument
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<string> Animals { get; set; }
}

可以用更安全的LINQ风格写法:

var result = await collection.AsQueryable()
    .Where(x => x.Id == id)
    .Select(x => new UserDocument
    {
        Id = x.Id,
        Name = x.Name,
        Animals = x.Animals.Skip(0).Take(3).ToList()
    })
    .FirstOrDefaultAsync();

这种写法MongoDB驱动会自动把Skip+Take翻译成对应的$slice操作,运行效率和原生写法完全一致,同时避免了硬编码字段名出错的问题。

运行上述代码后,查询id=1的文档时,返回的animals数组就会是你期望的["cat", "dog", "fish"]结果。


内容的提问来源于stack exchange,提问作者Abhishek Vyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:45:03