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())
{
    //...
}