C# $project或$group不支持<;文件>;

C# $project或$group不支持<;文件>;,c#,mongodb-.net-driver,C#,Mongodb .net Driver,我正在尝试使用投影运行聚合,但我得到了NotSupportedException:$project或$group不支持。我正在使用mongodb v3.4运行2.4.4版驱动程序 var filter = Builders<T>.Filter.Regex(x=>x.Value,"/test/gi"); var aggregate = collection.Aggregate() .Match(filter) .Project(x => new

我正在尝试使用投影运行聚合,但我得到了
NotSupportedException:$project或$group不支持
。我正在使用mongodb v3.4运行2.4.4版驱动程序

var filter = Builders<T>.Filter.Regex(x=>x.Value,"/test/gi");

var aggregate = collection.Aggregate()
       .Match(filter)
       .Project(x => new 
       {
          Idx = x.Value.IndexOf("test"),
          Result = x
       })
       .SortBy(x => x.Idx);
var-filter=Builders.filter.Regex(x=>x.Value,“/test/gi”);
var aggregate=collection.aggregate()
.Match(过滤器)
.Project(x=>new
{
Idx=x.Value.IndexOf(“测试”),
结果=x
})
.SortBy(x=>x.Idx);
我以为IndexOfCP是


我做错了什么?

问题不是由
IndexOf
引起的,而是由您的投影引起的。投影不应该包括文档本身,这只是MongoDB.Net驱动程序不支持的。 因此,以下不将
x
对象包含到投影中的查询将正常工作:

var aggregate = collection.Aggregate()
       .Match(filter)
       .Project(x => new 
       {
          Idx = x.Value.IndexOf("test"),
          // Result = x
       })
       .SortBy(x => x.Idx);
这里有几种可能的修复方法。最好的选择是在投影中不包括整个文档,而只包括进一步逻辑实际需要的字段,例如:

var aggregate = collection.Aggregate()
    .Match(filter)
    .Project(x => new
    {
        Idx = x.Value.IndexOf("test"),
        Value = x.Value,
        // ...
    })
    .SortBy(x => x.Idx);
但是,如果需要文档对象本身,可以将整个集合提取到客户端,然后使用LINQ to对象:

var aggregate = collection.Aggregate()
    .Match(filter)
    .ToList()
    .Select(x => new
        {
            Idx = x.Value.IndexOf("test"),
            Result = x
        })
        .OrderBy(x => x.Idx);

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

用例只是搜索最匹配(by
Idx
)放在顶部的位置,因此
Idx
仅用于排序。重要的还是实际结果,作为泛型类型,我只能访问
Id
Value
,所以我猜选项1不适用。