Хотите сделать агрегированный запрос с помощью .Lookup ()? (Драйвер MongoDB, c#) - PullRequest
0 голосов
/ 06 августа 2020

Я как бы новичок в драйвере MongoDB, поэтому у меня небольшая путаница относительно запросов.

У меня есть коллекции со следующими классами:

[BsonCollection("alerts")]
public class Alert
{
    public ObjectId Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    [BsonRepresentation(BsonType.ObjectId)]
    public string AlertTypeId { get; set; }

    [BsonIgnore]
    public AlertType AlertType { get; set; }
}

[BsonCollection("alert_types")]
public class AlertType
{
    public ObjectId Id { get; set; }

    public string Name { get; set; }
}

I ' m пытается заполнить свойство AlertType в Alert, используя оператор Lookup. Я пробовал следующее:

        var collection = database.GetCollection<Alert>(GetCollectionName(typeof(Alert)));

        var query = collection.Aggregate()
            .Lookup("alert_types", "AlertTypeId", "Id", "AlertType")
            .Unwind("AlertType")
            .As<Alert>()
            .ToList();

Но это возвращает пустой список.

Я тоже пробовал это:

        var query = collection.Aggregate()
            .Lookup("alert_types", x => ObjectId.Parse(x.AlertTypeId), y => y.Id, "AlertType")
            .Unwind("AlertType")
            .As<Alert>()
            .ToList();

Но я получаю ошибку в поиске разметка:

"Аргументы типа для метода IAggregateFluent.Lookup (строка, FieldDefinition, FieldDefinition, FieldDefinition, AggregateLookupOptions ) 'не может быть выведено из использования. Попробуйте указать аргументы типа явно. "

Более того, попробовал с коллекциями как Queryable следующим образом:

        IEnumerable<Alert> query = from a in collection.AsQueryable()
                                          join o in typesCollection.AsQueryable() on a.AlertTypeId equals o.Id.ToString() into joinedAlertTypes
                                          select new Alert(a, joinedAlertTypes.FirstOrDefault());

(Реализуя, как видите, конструктор в Alert, который назначает все свои свойства, а также AlertType из соединения)

Но я получаю сообщение об ошибке:

Невозможно определить информацию о сериализации для селектора внутреннего ключа в дереве: aggregate ([ ]). GroupJoin (aggregate ([]), a => a.AlertTypeId, o => o.Id.ToString (), (a, connectedAlertTypes) => new <> f__AnonymousType0`2 (a = a, connectedAlertTypes = connectedAlertTypes ))

Что я делаю не так?

1 Ответ

1 голос
/ 06 августа 2020

Отметьте здесь: https://github.com/mongodb/mongo-csharp-driver/blob/010e7ee46b085cdd3762894ece9e2d258b66ab0d/tests/MongoDB.Driver.Tests/AggregateFluentTests.cs#L464

Аргументы типа для метода ... не могут быть выведены из использования

вы должны указать общие c аргументы явно.

...