Mongodb C#对嵌套数组使用skip-limit

时间:2016-06-29 19:38:34

标签: c# mongodb

我的课程:

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或者我应该将项目放到另一个集合中?

1 个答案:

答案 0 :(得分:1)

我们可以在这里有两个场景:

  1. 我们总是要求一个主文档,并且需要跳过/限制此特定阵列。

  2. 我们正在请求未知数量的文档,然后我们可以对所有源文件中的一种合并数组进行跳过/限制。

  3. 两个解决方案都使用聚合框架和$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();
    

    欢迎任何评论!