我正在尝试使用投影运行聚合但我得到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);
我认为IndexOfCP
是supported。
我在这里做错了什么?
答案 0 :(得分:2)
问题不是由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到对象:
var aggregate = collection.Aggregate()
.Match(filter)
.ToList()
.Select(x => new
{
Idx = x.Value.IndexOf("test"),
Result = x
})
.OrderBy(x => x.Idx);
使用此方法作为最后一个选项,因为它会严重加载服务器和客户端。