$ project或$ group不支持<document>

r m*_*r m 7 c# mongodb-.net-driver

我试图用投影运行聚合但我得到了NotSupportedException: $project or $group does not support <document>.我正在使用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);
Run Code Online (Sandbox Code Playgroud)

我认为IndexOfCP支持的.

我在这做错了什么?

Cod*_*ler 7

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

var aggregate = collection.Aggregate()
       .Match(filter)
       .Project(x => new 
       {
          Idx = x.Value.IndexOf("test"),
          // Result = x
       })
       .SortBy(x => x.Idx);
Run Code Online (Sandbox Code Playgroud)

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

var aggregate = collection.Aggregate()
    .Match(filter)
    .Project(x => new
    {
        Idx = x.Value.IndexOf("test"),
        Value = x.Value,
        // ...
    })
    .SortBy(x => x.Idx);
Run Code Online (Sandbox Code Playgroud)

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

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

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