Как я могу получить подмножество результатов в драйвере MongoDB C#? - PullRequest
1 голос
/ 27 мая 2020

У меня есть коллекция версионных документов ("rHistory") с такой структурой:

    {
        "rid": "123e",
        "v": 1
    },
    {
        "rid": "143fe",
        "v": 1
    },
    {
        "rid": "143fe",
        "v": 2
    },
    {
        "rid": "143fe",
        "v": 3
    },
    {
        "rid": "123e",
        "v": 2
    }

Я пишу функцию для возврата подмножества документов в этой коллекции. В настоящее время я нахожу все совпадающие элементы следующим образом:

_rHistory.Find(r => rIds.Contains(r.RId)).ToList()

Однако я хочу вернуть только элемент с самой высокой версией каждого результата, например:

    {
        "rid": "143fe",
        "v": 3
    },
    {
        "rid": "123e",
        "v": 2
    }

Как мне найти самую новую версию каждого документа, соответствующего фильтру на rid, и вернуть результат в виде списка? Я предполагаю, что задействована агрегация, но мне не удается найти подходящие примеры. Очевидно, я бы не стал этого делать:

foreach (var rId in rIds)
{
    res.Add(_rHistory.Find(r => r.RId == rId).SortByDescending(f => f.Version).FirstOrDefault());
}

1 Ответ

1 голос
/ 28 мая 2020

Предположим, ваша модель выглядит так:

public class Model
{
    public ObjectId Id { get; set; }
    public string rid { get; set; }
    public int v { get; set; }
}

Вы можете сгруппировать по rid и вернуть .Max() v:

var col = database.GetCollection<Model>("rHistory");

var q = col.Aggregate()
    .Group(
        x => x.rid,
        gr => new {rid = gr.Key, v = gr.Max(f => f.v)});

var result = q.ToList();

MongoDB. NET драйвер переведет такой запрос в:

{ "$group" : { "_id" : "$rid", "v" : { "$max" : "$v" } } 
...