我有课
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。
使用
Select(x=>new{iKey,ms=x.ms.Select(y=>new{y.mKey,ss=y.ss.Select(z=>new{z.fs1,z.fs3})} )})