是否可以投影子数组并将它们作为一个数组检索?
Is it possible to project sub arrays and retrieve them as one array?
从 mongo 示例中假设我们有一个这样的集合;
{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
然后查询是这样的;
db.students.find( { semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 } )
由此产生的结果;
{ "_id" : 1, "grades" : [ 87 ] }
{ "_id" : 2, "grades" : [ 90 ] }
{ "_id" : 3, "grades" : [ 85 ] }
我想要这样的结果;
{"grades": [87, 90, 85]}
在一个阵列上。
我实现的 c# 代码给了我 LogLists 数组,代码与上面不同,但操作完全相同;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192")))
.Project(Builders<ServerName>.Projection.Exclude("_id").Include("LogList"))
.ToList();
我试过以下代码;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192"))).Project(t => t.LogList.SelectMany(k => k)).ToList();
但它给了我以下 SelectMany
的编译错误
The type arguments for method 'Enumerable.SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
如果我只使用 Select ;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192"))).Project(t => t.LogList.Select(k => k)).ToList();
结果类型是 List<IEnumarable<Log>>
,我不打算这样
我需要一个数组的原因是我必须在检索结果之前对结果进行分页。我正在使用 C#。任何帮助将不胜感激。
这个 c# 怎么样?
对于一个 Enumerable 中的所有年级
collection
.AsQueryable()
.SelectMany(x => x.grades);
对于分页,只需添加 Skip(10)、Take(10) 扩展方法。
从 mongo 示例中假设我们有一个这样的集合;
{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
然后查询是这样的;
db.students.find( { semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 } )
由此产生的结果;
{ "_id" : 1, "grades" : [ 87 ] }
{ "_id" : 2, "grades" : [ 90 ] }
{ "_id" : 3, "grades" : [ 85 ] }
我想要这样的结果;
{"grades": [87, 90, 85]}
在一个阵列上。
我实现的 c# 代码给了我 LogLists 数组,代码与上面不同,但操作完全相同;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192")))
.Project(Builders<ServerName>.Projection.Exclude("_id").Include("LogList"))
.ToList();
我试过以下代码;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192"))).Project(t => t.LogList.SelectMany(k => k)).ToList();
但它给了我以下 SelectMany
的编译错误The type arguments for method 'Enumerable.SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
如果我只使用 Select ;
var result = collectionServerName.Find(x => x.LogList.Any(p => p.Ip.Contains("192"))).Project(t => t.LogList.Select(k => k)).ToList();
结果类型是 List<IEnumarable<Log>>
,我不打算这样
我需要一个数组的原因是我必须在检索结果之前对结果进行分页。我正在使用 C#。任何帮助将不胜感激。
这个 c# 怎么样?
对于一个 Enumerable 中的所有年级
collection .AsQueryable() .SelectMany(x => x.grades);
对于分页,只需添加 Skip(10)、Take(10) 扩展方法。