当前位置: 首页 > 知识库问答 >
问题:

在Mongodb C#驱动程序中聚合$substr

姬熙云
2023-03-14

我开始在我的应用程序中使用MongoDB。我正在使用Robo3T学习和测试查询,现在,我正在将查询翻译成C#。

我对蒙古机器人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 ]"
}

共有1个答案

慕容文昌
2023-03-14

您是否尝试过仅使用流畅的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();
 类似资料:
  • 我是mongo的新手。 我试图得到一个文档的子文档,这是我的文档: 我想得到这个子文档: 我想我需要使用这些类:http://php.net/manual/en/mongocollection.aggregate.php但我没有将它用于我的manager类实例:http://php.net/manual/en/class.mongodb-driver-manager.php. PHP手册没有说明如

  • 我有一个包含联系人的集合,每个联系人文档都有和属性。 现在我想使用Java和版本3.2中的MongoDb Java驱动程序查询数据库。 谢谢。

  • 我想在Mongo 3.2中执行聚合,如下所述,但在Java中: https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup 目前,我的java查询对象非常简单: 除了按employeId进行筛选外,我还想加入公司的此集合(其中employee.company\u id=company.i

  • 我正在尝试创建一个简单的应用程序,它将我站点上每个网页的页面视图写给Cassandra。我想写每5分钟的累积页面浏览量从一个逻辑小时开始。 我的代码如下所示: 我只需要在聚合5分钟后写,而不是每次更新。有可能吗?阅读这里表明,不使用低级API,可能是不行的,我正试图避免使用低级API,因为这似乎是一个足够简单的任务,可以用更高级的API来完成。

  • 如何将Crystal Reports与ucanaccess jdbc驱动程序一起使用?我得到“未找到驱动程序”错误。我将ucanaccess jar文件复制到程序文件(C:\program files(x86)\Business objects\common\3.5\java)中的业务对象,编辑了crconfig.xml文件,并且已经在Crystal Reports中配置了JDBC(JNDI)。M

  • 我有一个新安装的Wildfly10应用服务器在独立模式下运行。我需要部署一个需要MySQL JDBC驱动程序的项目。我按照在JDBC驱动程序安装中找到的教程安装了驱动程序(我选择了模块安装)。重新启动WildFly后,我在console.log中读到: 信息[org.jboss.as.connector.subsystems.datasources](ServerService线程池--33)WF