【问题标题】:MongoDB C# how to filter documents by multiple distinct fields?MongoDB C#如何按多个不同的字段过滤文档?
【发布时间】:2023-04-01 19:01:01
【问题描述】:

我在 MongoDB 中有一份公司股票价格列表。每个文档如下所示:

{
"_id":"5b93f2719c02f096d5cb9608",
"dateString":"2018-09-07",
"close":260.87,
"companyName":"Adobe Systems, Inc.",
"high":263.67,
"low":257.12,
"open":258,
"symbol":"ADBE",
"timestamp":1536296400
}

当然,数据库中有很多这样的文档。 我需要以不同的方式获取符号和公司名称的列表,例如我想要这个:

List<BsonDocument> {
    { "symbol": "ADBE", "companyName": "Adobe Systems, Inc." },
    { "symbol": "MCO", "companyName": "Moody's Corp" }
    ...
}

我找到了一种只为一个字段获取不同值的方法,如下所示:

public List<string> GetCompanySymbolNames() {
    return m_CompanyCollection.Distinct<string>("symbol", new BsonDocument())?.ToList();
}

但是有没有办法通过 2 个字段进行不同的过滤? 这是一个 C# mongodb 驱动程序

附言我看过这个话题count multiple distinct fields by group with Mongo 但我无法让它与 C# 驱动程序一起工作

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver distinct-values


    【解决方案1】:

    我已经这样解决了:

    public List<SymbolItem> GetCompanySymbolItems() {
        // https://docs.mongodb.com/manual/reference/operator/aggregation/group/
        var result = new List<SymbolItem>();
        m_CompanyCollection.Aggregate()
            .Group(new BsonDocument("_id",
                new BsonDocument {{"symbol", "$symbol"}, {"companyName", "$companyName"}}))
            .ToList()
            .ForEach(bson => {
                var symbolData = bson["_id"];
                result.Add(new SymbolItem {
                    Tag = symbolData["symbol"].AsString,
                    Name = symbolData["companyName"].AsString
                });
            });
    
        return result;
    }
    

    现在我得到了我想要的结果

    【讨论】:

      【解决方案2】:

      这工作正常$group$project

          db.col.aggregate([{
              "$group": {
                  "_id": {
                      "symbol": "$symbol",
                      "companyName": "$companyName"
                  },
                  "occurrences": {
                      "$sum": 1
                  }
              }
          },
          {
              "$project": {
                  "symbol": "$_id.symbol",
                  "companyName": "$_id.companyName",
                  "occurrences": "$occurrences",
                  "_id": 0
              }
          }
      ])
      

      【讨论】:

      • 不确定如何将它与 c# 驱动程序(我正在询问)一起使用。驱动的Group方法中没有“occurrences”Bson的参数,它只接受1个BsonDocument
      【解决方案3】:

      也许你可以使用聚合函数:

      例如,我的收藏:

      代码:

       var dist = dbCollection.Aggregate().Group(d => d.Name, o =>
                  new
                  {   
                      Name = o.Key,
                      Data = o.Select(_ => _.Symbol).Distinct(),
                  }).ToEnumerable();
      
                  dist.ToList().ForEach(_ =>
                      {
                          _.Data.ToList().ForEach(d => Console.WriteLine("Company: " +_.Name + " Symbol: " + d));
                      }
                  );
      

      结果:

      【讨论】:

      • 这和我的方案差不多
      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2020-02-18
      • 2021-12-30
      • 2022-06-30
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多