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是支持的.
我在这做错了什么?
问题不是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)
将此方法用作最后一个选项,因为它会同时负载大量服务器和客户端。
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |