Агрегировать $ substr в Mongodb C # Driver - PullRequest
0 голосов
/ 12 марта 2019

Я начал использовать 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 # CODE

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();

Таким образомработает нормально, но группируется по всей строке Date, и я хотел бы сгруппировать по короткой строковой дате, например: «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 Ответ

1 голос
/ 12 марта 2019

Вы пытались просто использовать свободный синтаксис 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();
...