【问题标题】:Aggregate $substr in Mongodb C# Driver在 Mongodb C# 驱动程序中聚合 $substr
【发布时间】:2019-08-03 01:59:43
【问题描述】:

我开始在我的应用程序中使用 MongoDB。我正在使用 Robo 3T 来学习和测试查询,现在,我正在将查询转换为 C#。

我对 MONGO ROBO 3T 的查询

db.dbCENTRAL.aggregate([
          { 
              $match: { PartnerId: "2021", DATAINST: {$gte: "2018-01-01 00:00:00", $lte: "2019-03-12 23:59:59"}, }   
          },

          { 
               $group: { _id:  { $substr : ["$DATAINST", 0, 10 ] }, count: { $sum: 1 }}
          }
])

在 Robo 3T 上运行上面的脚本,它检索到了这个结果:

{
    "_id" : "2018-01-10",
    "count" : 1.0
}

/* 2 */
{
    "_id" : "2018-02-09",
    "count" : 1.0
}

/* 3 */
{
    "_id" : "2018-02-26",
    "count" : 1.0
}

/* 4 */
{
    "_id" : "2018-03-02",
    "count" : 1.0
}

/* 5 */
{
    "_id" : "2018-03-08",
    "count" : 1.0
}

现在,我试图在我的 .NET MVC 项目中重现此结果,但我很难将子字符串转换为 C#。

C# 代码

var connString = "mongodb+srv:";
var client = new MongoClient(connString);
var db = client.GetDatabase("SyncMaster");
var collection = db.GetCollection<BsonDocument>("dbCENTRAL");

var match1 = new BsonDocument("$match", new BsonDocument("PartnerId", "2021"));

var match2 = new BsonDocument { { "$match", new BsonDocument { { "DATAINST", new BsonDocument { { "$gte", data1 }, { "$lt", data2 } } } } } };

var group = new BsonDocument
                {
                    { "$group",
                        new BsonDocument
                            {
                                { "_id", new BsonDocument
                                             {
                                                 {
                                                     "Dia", "$DATAINST"
                                                 }
                                             }
                                },
                                {
                                    "Count", new BsonDocument
                                                 {
                                                     {
                                                         "$sum", 1
                                                     }
                                                 }
                                }
                            }
                  }
                };

var pipeline = new[] { match1, match2, group };

var result = collection.Aggregate<BsonDocument>(pipeline).ToList();

这种方式工作正常,但是,它按整个字符串日期分组,我想按短字符串日期分组,例如:“2019-03-01”。

我试过这种方式,但没有成功,它返回_id:null

{
   "Dia", "$substr : [$DATAINST, 0, 10 ]"
}

然后我尝试了这个:

 {
   "Dia", new BsonDocument {

                               {
                                   "$substr",  "[$DATAINST, 0, 10 ]"

                                }
                            }
  }

我收到了这个错误: MongoDB.Driver.MongoCommandException: '命令聚合失败:表达式 $substrBytes 只需要 3 个参数。 1 个被传入..'

我也试过了:

{
   "$substr",  "[\"$DATAINST\", 0, 10 ]"
}

【问题讨论】:

    标签: c# mongodb group-by substring


    【解决方案1】:

    您是否尝试过仅使用流利的 C# 语法来创建聚合管道?

    var client = new MongoClient();
    var database = client.GetDatabase("test");
    var collection = database.GetCollection<Central>("dbCENTRAL");
    
    var filter = Builders<Central>.Filter.Eq(x => x.PartnerId, "2021")
                           & Builders<Central>.Filter.Gte(x => x.DATAINST, "2018-01-01 00:00:00")
                           & Builders<Central>.Filter.Lte(x => x.DATAINST, "2019-03-12 23:59:59");
    
    var listAsync = await collection.Aggregate()
        .Match(filter)
        .Group(central => central.DATAINST.Substring(0, 10), g => new { Id = g.Key, Count = g.Count()})
        .ToListAsync();
    

    【讨论】:

    • 嗨@Kelvin Smith 非常感谢您的回复。不,我没有尝试过流畅的 C# 语法,我认为我尝试的这种方式更具性能。再次感谢您的建议!
    • @RogerioAzevedo 流畅的方式只是意味着一切都会在编译时进行类型检查,构建的聚合应该是相同的。
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2020-05-18
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多