我的课程:
class Product
{
public string _id {get; set;}
public IEnumerable<Item> Items {get; set;}
public int ItemsCount {get; set;}
}
class Item
{
public string Name {get; set;}
}
我需要仅选择Items
并为其处理skip limit
(分页)。算我可以存储在对象中。是否可以使用mongo
或者我应该将项目放到另一个集合中?
答案 0 :(得分:1)
我们可以在这里有两个场景:
我们总是要求一个主文档,并且需要跳过/限制此特定阵列。
我们正在请求未知数量的文档,然后我们可以对所有源文件中的一种合并数组进行跳过/限制。
两个解决方案都使用聚合框架和$unwind
阶段,差异在于$match
在第一种情况下总是只返回一个文档(假设与objectId
匹配)。
var aggregate = collection.Aggregate().Match(x => x.Id == ourNeededId)
.Unwind("Items").Skip(3).Limit(3).Project<Product>(project);
作为输出,我们将获得3个文件,我们可以a)使用$group
服务器端进行合并,或者使用c#代码进行迭代和处理。
编辑
var aggregate =
collection.Aggregate()
.Match(x => x._id == "some id here")
.Unwind("Items")
.Skip(3)
.Limit(3)
.Group(BsonDocument.Parse("{_id:{id:'$_id', ItemsCount:'$ItemsCount' },Items:{$push:'$Items'} }"))
.Project<Product>(BsonDocument.Parse("{_id:'$_id.id', ItemsCount:'$_id.ItemsCount', Items:1 }"))
.ToList();
欢迎任何评论!