当我尝试在选择中执行加入并过滤时,mongodb 2.4.4驱动器抛出此例外:
system.notsupportedException:'$ project或$ group不支持 {文档}。'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();
您的问题不是由联接或过滤而导致的,而是由您的投影引起的。投影不应包括文档本身,这只是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();
使用此方法作为最后一个选项,因为它加载了服务器和客户端。