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

MongoDB聚合中如何将展开文档重组为原嵌套结构?

MongoDB C#聚合操作中还原嵌套结构

定义的嵌套类

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;
        }
    }
}

当前执行的聚合操作

该类对应的文档存储在MongoDB Atlas中,我使用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方法?

我曾实现过一层嵌套的分组:

.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。

最终解决方案

直接使用以下代码即可实现需求,无需使用Unwind/Group或SelectMany/GroupBy:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:37:22