如何在MongoDB中使用collection.Aggregate.Project()?
How to use collection.Aggregate.Project() in MongoDB?
考虑以下代码:
var results = collection.Aggregate()
...
.Lookup( ... )
.Project( ??? );
我需要在上述查询中调用 Project()。我一直无法弄清楚如何构建 ProjectionDefinition<T1, T2>
类型的投影定义,这是 Project() 所需要的。
Builders class 在这种情况下似乎不起作用:
var projection = Builders<Event>.Projection.Include(x => x).Include("agg_res.SomeField");
因为它实例化了类型 ProjectionDefinition<T>
的定义。
我找到了答案。聚合可以通过使用 Lookup() 的不同重载同时执行查找和投影:
var results = collection.Aggregate()
.Match(filter)
.Lookup<Event, User, AggregatedEvent>(users, e => e.OwnerId, u => u.Id, r => r.OwnerUsers)
.ToList();
这允许使用 lambda 来指示应匹配哪些字段以及放置连接结果的位置(上例中的 OwnerUsers)。请注意,AggregatedEvent 扩展了 Event 并包含一个名为 OwnerUsers 的数组字段。这是放置火柴的地方。
考虑以下代码:
var results = collection.Aggregate()
...
.Lookup( ... )
.Project( ??? );
我需要在上述查询中调用 Project()。我一直无法弄清楚如何构建 ProjectionDefinition<T1, T2>
类型的投影定义,这是 Project() 所需要的。
Builders class 在这种情况下似乎不起作用:
var projection = Builders<Event>.Projection.Include(x => x).Include("agg_res.SomeField");
因为它实例化了类型 ProjectionDefinition<T>
的定义。
我找到了答案。聚合可以通过使用 Lookup() 的不同重载同时执行查找和投影:
var results = collection.Aggregate()
.Match(filter)
.Lookup<Event, User, AggregatedEvent>(users, e => e.OwnerId, u => u.Id, r => r.OwnerUsers)
.ToList();
这允许使用 lambda 来指示应匹配哪些字段以及放置连接结果的位置(上例中的 OwnerUsers)。请注意,AggregatedEvent 扩展了 Event 并包含一个名为 OwnerUsers 的数组字段。这是放置火柴的地方。