如何用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
相关产品推荐
相关产品推荐

