MongoDB C #, как фильтровать документы по нескольким отдельным полям? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть список цен акций компании в 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

ps Я видел эту тему Подсчет нескольких различных полей по группам с Mongo Но я не мог заставить его работать с драйвером C #

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Работает нормально $ 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
        }
    }
])
0 голосов
/ 23 сентября 2018

Может быть, вы можете использовать агрегатные функции:

Например, моя коллекция:

enter image description here

Код:

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

Результат:

enter image description here

0 голосов
/ 22 сентября 2018

Я решил это так:

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;
}

Теперь я получаю результаты, которые хотел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...