【发布时间】:2021-01-06 13:40:29
【问题描述】:
我正在使用 Mongo C# v 2.11.5 按用户的 CategoryId 对用户进行分组。我希望变量 list_of_groups 包含一个组列表,其中每个组都有一个组中所有文档的列表,其中每个文档都包含其所有单独的属性。我不想在任何字段上应用任何累加器函数。
UserGroup 类是:
public class UserGroup
{
public string gid {get; set;}
public List<Users> users { get; set; }
}
我的分组查询是
var list_of_groups = UserCollection
.Aggregate()
.Group(usr => usr.CategoryId,
g => new UserGroup { gid = g.Key, users = g.ToList() })
.ToList<UserGroup>();
我想创建一个“列表列表”,其中每个内部列表都包含其分组的所有文档,即这种类型的结构:
List<List<UserGroup>>(
- List1<UserGroup> (list of complete documents belonging to CategoryId 1)
- List2<UserGroup> (list of complete documents belonging to CategoryId 2)
- List3<UserGroup> (list of complete documents belonging to CategoryId 3)
)
不起作用,因为在运行时会生成以下错误:
System.NotSupportedException
HResult=0x80131515
Message=Specified method is not supported.
Source=MongoDB.Driver
谁能指出我在这里遗漏了什么?我已经转了一段时间了。我是否应该不使用 Group 函数,也许其他一些函数更合适,因为我不想应用任何累加器函数,并且因为我希望每个组中的每个文档都有其所有属性可用?
堆栈跟踪:
at MongoDB.Driver.Linq.Processors.AccumulatorBinder.GetAccumulatorArgument(Expression node)
at MongoDB.Driver.Linq.Processors.AccumulatorBinder.TryGetAccumulatorTypeAndArgument(PipelineExpression node, AccumulatorType& accumulatorType, Expression& argument)
at MongoDB.Driver.Linq.Processors.AccumulatorBinder.VisitPipeline(PipelineExpression node)
at MongoDB.Driver.Linq.Expressions.PipelineExpression.Accept(ExtensionExpressionVisitor visitor)
at MongoDB.Driver.Linq.Expressions.ExtensionExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at MongoDB.Driver.Linq.Processors.AccumulatorBinder.Bind(Expression node, IBindingContext bindingContext)
at MongoDB.Driver.Linq.Processors.EmbeddedPipeline.EmbeddedPipelineBinder.Bind(Expression node, IBindingContext parent)
at MongoDB.Driver.Linq.Processors.SerializationBinder.BindEmbeddedPipeline(MethodCallExpression node)
at MongoDB.Driver.Linq.Processors.SerializationBinder.VisitMethodCall(MethodCallExpression node)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at MongoDB.Driver.Linq.Processors.SerializationBinder.Visit(Expression node)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberAssignment(MemberAssignment node)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes, Func`2 elementVisitor)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberInit(MemberInitExpression node)
at System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at MongoDB.Driver.Linq.Processors.SerializationBinder.Visit(Expression node)
at MongoDB.Driver.Linq.Processors.SerializationBinder.Bind(Expression node, IBindingContext context, Boolean isClientSideProjection)
at MongoDB.Driver.Linq.Processors.PipelineBindingContext.Bind(Expression node, Boolean isClientSideProjection)
at MongoDB.Driver.Linq.Processors.PipelineBindingContext.Bind(Expression node)
at MongoDB.Driver.Linq.Translators.AggregateGroupTranslator.BindGroup[TKey,TDocument,TResult](PipelineBindingContext bindingContext, Expression`1 groupProjector, IBsonSerializer`1 parameterSerializer, Expression keySelector)
at MongoDB.Driver.Linq.Translators.AggregateGroupTranslator.Translate[TKey,TDocument,TResult](Expression`1 idProjector, Expression`1 groupProjector, IBsonSerializer`1 parameterSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions)
at MongoDB.Driver.GroupExpressionProjection`3.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.PipelineStageDefinitionBuilder.<>c__DisplayClass19_0`2.<Group>b__0(IBsonSerializer`1 s, IBsonSerializerRegistry sr)
at MongoDB.Driver.DelegatedPipelineStageDefinition`2.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.AppendedStagePipelineDefinition`3.Render(IBsonSerializer`1 inputSerializer, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.MongoCollectionImpl`1.Aggregate[TResult](IClientSessionHandle session, PipelineDefinition`2 pipeline, AggregateOptions options, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.<>c__DisplayClass19_0`1.<Aggregate>b__0(IClientSessionHandle session)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.Aggregate[TResult](PipelineDefinition`2 pipeline, AggregateOptions options, CancellationToken cancellationToken)
at MongoDB.Driver.CollectionAggregateFluent`2.ToCursor(CancellationToken cancellationToken)
【问题讨论】:
-
您对
.Aggregate()有什么期望?这是有关此方法的文档。 docs.microsoft.com/en-us/dotnet/api/…. -
@DragandDrop 不确定我们是否在考虑相同的 Aggregate() 方法 - 我正在使用 IMongoCollectionExtensions.Aggregate 从mongodb.github.io/mongo-csharp-driver/2.8/apidocs/html/…返回 IAggregateFluent
-
妈不好。没用过那个。我错过了标签聚合框架,这很好地暗示了它是一种特定于框架的方法。为了我的辩护,我经常看到与该框架无关的裸聚合代码,因为它是 Crtl 空间建议中的第一种方法。它有时用作占位符或 go-get-it 方法。
标签: c# mongodb mongodb-query aggregation-framework