Mongo 在 C# 中对具有相同数据结构的集合进行 Db 查询
Mongo Db query over collections with same datastructure in c#
我想查询更多具有相同数据结构的集合,因此我需要合并这些集合。
我有 Measurements2016、2017、2018 等系列。
但是如果我返回集合,我只有 IMongoQuerable 列表中的第一个集合。
目前代码是这样的
public IMongoQueryable<MeasureDocument> MeasureDocuments()
{
IMongoQueryable<MeasureDocument> tmpCollection = database.GetCollection<MeasureDocument>($"Measurements2014").AsQueryable();
for (int i = 2015; i <= DateTime.Now.Year; i++)
{
tmpCollection.Union(this.database.GetCollection<MeasureDocument>($"Measurements{i}").AsQueryable());
}
return tmpCollection;
}
为什么这不起作用?
您不了解 Linq 的方法 Union
是如何工作的。它不会修改您调用它的集合(在本例中为 tmpCollection
)。文档说:
Produces the set union of two sequences by using the default equality comparer.
它有一个 return 类型 System.Collections.Generic.IEnumerable<TSource>
,这是两个集合的实际联合。
您的代码应如下所示:
tmpCollection = tmpCollection.Union(this.database.GetCollection<MeasureDocument>($"Measurements{i}").AsQueryable());
编辑
IMongoQueryable
似乎不支持Union
/Concat
操作。您的另一种选择是使用支持集合联合的流畅聚合接口 IAggregateFluent。但是您失去了一些灵活性,因为它没有所有 IMongoQueryable
功能。
使用 IAggregateFluent,您的代码将如下所示:
public IAggregateFluent<MeasureDocument> MeasureDocuments()
{
var aggregation = database.GetCollection<MeasureDocument>($"Measurements2014").Aggregate();
for (int i = 2015; i <= DateTime.Now.Year; i++)
{
aggregation = aggregation.UnionWith(database.GetCollection<MeasureDocument>($"Measurements{i}"));
}
return aggregation;
}
然后如果你想过滤聚合你可以这样做:
var filter = Builders<MeasureDocument>
.Filter
.Eq(m => m.Field, "2018");
var documentsOf2018 = MeasureDocuments().Match(filter);
最后你可以调用ToEnumerable()
来枚举文档:
foreach (var document in documentsOf2018.ToEnumerable())
{
//...
}
我想查询更多具有相同数据结构的集合,因此我需要合并这些集合。
我有 Measurements2016、2017、2018 等系列。
但是如果我返回集合,我只有 IMongoQuerable 列表中的第一个集合。
目前代码是这样的
public IMongoQueryable<MeasureDocument> MeasureDocuments()
{
IMongoQueryable<MeasureDocument> tmpCollection = database.GetCollection<MeasureDocument>($"Measurements2014").AsQueryable();
for (int i = 2015; i <= DateTime.Now.Year; i++)
{
tmpCollection.Union(this.database.GetCollection<MeasureDocument>($"Measurements{i}").AsQueryable());
}
return tmpCollection;
}
为什么这不起作用?
您不了解 Linq 的方法 Union
是如何工作的。它不会修改您调用它的集合(在本例中为 tmpCollection
)。文档说:
Produces the set union of two sequences by using the default equality comparer.
它有一个 return 类型 System.Collections.Generic.IEnumerable<TSource>
,这是两个集合的实际联合。
您的代码应如下所示:
tmpCollection = tmpCollection.Union(this.database.GetCollection<MeasureDocument>($"Measurements{i}").AsQueryable());
编辑
IMongoQueryable
似乎不支持Union
/Concat
操作。您的另一种选择是使用支持集合联合的流畅聚合接口 IAggregateFluent。但是您失去了一些灵活性,因为它没有所有 IMongoQueryable
功能。
使用 IAggregateFluent,您的代码将如下所示:
public IAggregateFluent<MeasureDocument> MeasureDocuments()
{
var aggregation = database.GetCollection<MeasureDocument>($"Measurements2014").Aggregate();
for (int i = 2015; i <= DateTime.Now.Year; i++)
{
aggregation = aggregation.UnionWith(database.GetCollection<MeasureDocument>($"Measurements{i}"));
}
return aggregation;
}
然后如果你想过滤聚合你可以这样做:
var filter = Builders<MeasureDocument>
.Filter
.Eq(m => m.Field, "2018");
var documentsOf2018 = MeasureDocuments().Match(filter);
最后你可以调用ToEnumerable()
来枚举文档:
foreach (var document in documentsOf2018.ToEnumerable())
{
//...
}