System.NotSupportedException:' $ project或$ group不支持{document}。' MongoDB的

时间:2017-12-27 23:58:45

标签: c# mongodb

当我尝试在select中执行join和filter时,mongodb 2.4.4驱动器抛出此异常:

  

System.NotSupportedException:' $ project或$ group不支持   {文档}&#39。 mongodb的

以下加入和过滤有什么问题?

var appt = (from col1 in collection1.AsQueryable()
    join col2 in collection2.AsQueryable() on col1.Id equals col2.RefKey into grp
    select new {
        col1, filteredCol = col1.BandId == "" ? grp : grp.Where(t => t.Name ="Hello")
    }).Take(10).ToList();

1 个答案:

答案 0 :(得分:1)

您的问题不是由加入或过滤引起的,而是由您的预测引起的。投影不应包含文档本身,MongoDB .Net驱动程序不支持。

因此,在投影中不包含col1对象的以下查询将正常工作:

var appt = (from col1 in collection1.AsQueryable()
    join col2 in collection2.AsQueryable() on col1.Id equals col2.RefKey into grp
    select new
    {
        //col1,
        filteredCol = col1.BandId == "" ? grp : grp.Where(t => t.Name == "Hello")
    }).Take(10).ToList();

这里有几种可能的修复方法。最好的选择是在投影中不包括整个文档,而只包括进一步逻辑实际需要的字段,例如:

var appt = (from col1 in collection1.AsQueryable()
    join col2 in collection2.AsQueryable() on col1.Id equals col2.RefKey into grp
    select new
    {
        col1.Id,
        col1.BandId,
        filteredCol = col1.BandId == "" ? grp : grp.Where(t => t.Name == "Hello")
    }).Take(10).ToList();

但是,如果您需要文档对象本身,则可以使用.AsEnumerable()将整个集合提取到客户端,然后使用LINQ到对象:

var appt = (from col1 in collection1.AsQueryable().AsEnumerable()
    join col2 in collection2.AsQueryable() on col1.Id equals col2.RefKey into grp
    select new
    {
        col1,
        filteredCol = col1.BandId == "" ? grp : grp.Where(t => t.Name == "Hello")
    }).Take(10).ToList();

使用此方法作为最后一个选项,因为它会严重加载服务器和客户端。