MongoDB Агрегатная функция до C# - PullRequest
2 голосов
/ 26 апреля 2020

это беспокоило меня всю ночь.

У меня есть следующая функция MongoDb, которая возвращает самые популярные запросы в коллекции, включая количество

db.search.aggregate([
    {
        $match: {
            keywords: { $not: {$size: 0} }
        }
    },
    { $unwind: "$term" },
    {
        $group: {
            _id: {$toLower: '$term'},
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 }
        }
    },
    { $sort : { count : -1} },
    { $limit : 100 }
]);

Я пытаюсь переместить это в C# функция, и я получаю сообщение об ошибке:

MongoDB.Driver.MongoCommandException: 'Сбой агрегата команды: объект спецификации этапа конвейера должен содержать ровно одно поле ..'

Вот моя C# версия, кто-нибудь может увидеть, что мне не хватает?

var pipeline = new BsonDocument[] {
new BsonDocument
{
    {
        "$match",
        new BsonDocument {{"keywords", new BsonDocument {{"$not", new BsonDocument {{"$size", 0}}}}}}
    }
},
new BsonDocument {{"$unwind", "$term"}},
new BsonDocument
{
    {
        "$group", new BsonDocument
        {
            {"_id", new BsonDocument {{"$toLower", "$term"}}},
            {
                "count", new BsonDocument
                {
                    {"$sum", 1}
                }
            }
        }
    }
},
new BsonDocument
{
    {
        "$match", new BsonDocument
        {
            {"count", new BsonDocument {{"$gte", 2}}}
        }
    },
    {
        "$sort", new BsonDocument
        {
            {"count", -1}
        }
    },
    {"$limit", 100}
}
};

var result = collection.Aggregate<BsonDocument>(pipeline).ToListAsync();
Console.WriteLine(result);

1 Ответ

1 голос
/ 26 апреля 2020

$match, $sort и $limit должны быть отдельными этапами конвейера агрегации. В вашем случае у них есть один root BsonDocument, попробуйте:

...
new BsonDocument
{
    {
        "$match", new BsonDocument
        {
            {"count", new BsonDocument {{"$gte", 2}}}
        }
    }
},
new BsonDocument()
{
    { "$sort", new BsonDocument
        {
            {"count", -1}
        }
    }
},
new BsonDocument()
{
    { "$limit", 100 }
}
...