MongoDB C#查询嵌套文档

3
我使用C#驱动程序与MongoDB。我有一个包含子文档的集合。
public class EntityA 
{
    public string Name { get; set; }

    public string Description { get; set; }

    public List<EntityB> BItems { get; set; }
}

public class EntityB
{
    public string BName { get; set; }

    public string BDesc { get; set; }
}

我想创建一个查询并获取 EntityB 项目的列表。

from a in mycollection
where BItems.Any(k => k.BName == entity.Name)
select a.BItems;

我可以查询嵌套的文档,但当我检索列表时,所有其他子项都会出现在列表中,我如何获取BItems的列表以满足我的条件。我可以查询子文档,但当我想获取列表时,所有Bitems都会出现在我的列表中。


我建议您在更新帖子时附上一些MongoDB文档样例以及您想在响应查询时看到的期望文档。 - Saleem
3个回答

2

如果我理解得正确,您希望在BName等于其父级Name字段时返回BItems集合。如果是这样的话,那么可以这样做:

var result = from a in mycollection
             from b in a.BItems
             where a.Name == b.BName
             select b;

@NikolaLukovic,你的查询有一个小错误。你应该使用b来投影,而不是a.BItems - ocuenca
我将驱动程序升级到最新版本,但仍然收到“不支持SelectMany查询运算符”错误。 - Bilgehan
1
当我想执行查询时,$project或$group不支持{document}。 - Bilgehan

1
作为我理解的内容,SelectMany用于在mongodb中展开属性,使用展开属性时我们不能直接添加条件。
请参考链接:MongoDB finding nested objects that meet criteria
       var result = from k in (from a in col.AsQueryable()
                     from b in a.Columns        
                     select b) where k.ColumnName==a.Name select k;

0

现在,我已经使用MongoDB C#驱动程序2.2.3和MongoDB 3.2.1进行了测试,确实支持SelectMany,因此您也可以这样做:

 var entities= mycollection.AsQueryable<EntityA>()
                           .SelectMany(e=>e.BItems, (e,b)=>new {entityA=e,bitem=b})
                           .Where(t => t.entityA.Name == t.bitem.Name)
                           .Select(t=>t.bitem)
                           .ToList();

更新

另一个可能的解决方案是先获取数据,然后在内存中进行过滤:

var entities= mycollection.AsQueryable<EntityA>()
                          .Select(e=>new{e.Name,e.BItems}).ToList();

var result=entities.SelectMany(e=>e.BItems.Where(b=>b.Name==e.Name));

1
我升级了驱动程序到最新版本,但仍然收到“不支持SelectMany查询运算符”错误。 - Bilgehan
你安装了哪个版本的MongoDB? - ocuenca
可能只支持MongoDB 3.X服务器版本。你试过我的第二个解决方案了吗? - ocuenca
我有太多的记录,如果我尝试在内存中过滤,那么我会遇到性能问题。 - Bilgehan
那么在这种情况下,我不知道我的测试是如何工作的。我认为为了实现你在服务器端所需的功能,你需要使用聚合框架。 - ocuenca
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接