展开、项目、组嵌套文档

问题描述 投票:0回答:1

我有课

private sealed class IIn
{
    public String iKey;
    public String fi1;
    public String fi2;
    public List<M> ms;

    public sealed class M
    {
        public String mKey;
        public String fm1;
        public String fm2;
        public List<S> ss;

        public sealed class S
        {
            public String fs1;
            public String fs2;
            public String fs3;
        }
    }
}

存储在(Atlas)MongoDB 中。接下来,我使用 MongoDB Driver C# LINQ 实现

var testItems = testCollection
    .Aggregate()
    .Match(x => x.iKey.Equals("i1"))
    .Unwind(x => x.ms)
    .Unwind(x => x["ms"]["ss"])
    .Match(x => x["ms"]["ss"]["fs1"].Equals("fs1111"))
    .Project(
    x => new
    {
        iKey = x["iKey"],
        mKey = x["ms"]["mKey"],
        fs1 = x["ms"]["ss"]["fs1"],
        fs3 = x["ms"]["ss"]["fs3"]
    })
    .Match(x => x.fs3.Equals("fs3111"))
    .Group()
    .ToList();

减少文档数量,展开,减少展开行数,选择我需要的字段,保留我想要的行。然后我想将它们分组回相同的嵌套结构,减去不感兴趣的字段。

这种分组方法可以用于聚合吗?

我用它来获得一层嵌套。

.Group(
    x => x.iKey,
    x => new
    {
        iKey = x.Key,
        ms = x.Select(
            y => new
            {
                mKey = y.mKey,
                fs1 = y.fs1,
                fs3 = y.fs3
            })
    })

编辑: 我尝试了 AsQueryable。 我无法让 SelectMany 传播 iKey 和 mKey 解决方案:使用 Select(x=>new{iKey,ms=x.ms.Select(y=>new{y.mKey,ss=y.ss.Select(z=>new{z.fs1,z .fs3})})}) 让它发挥作用。不需要 Unwind/Group 或 SelectMany/GroupBy。

mongodb-.net-driver
1个回答
0
投票

使用

Select(x=>new{iKey,ms=x.ms.Select(y=>new{y.mKey,ss=y.ss.Select(z=>new{z.fs1,z.fs3})} )})

© www.soinside.com 2019 - 2024. All rights reserved.