Трабл с раскруткой / проектом на мон go C# драйвере - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь получить массив всех точек из отчетов, чтобы их можно было сопоставить. Для этого мне нужна раскрутка / проекция, но я изо всех сил пытаюсь обойти это.

Результат отформатирован так:

"totalPoints": 200,
    "points": [
        {
            "itemId": "5e9592edb4959a52b8493f6d",
            "itemName": "Numquam hic minus repellat sequi.",
            "name": null,
            "longitude": null,
            "latitude": null
        },
...

Как видите, я ' m получает пустые значения для трех нижних элементов.

Вот запрос, который я использую

            var points = await _reportDocs.Aggregate()
                .Match(filter.GenerateFilter())
                .Unwind<IntelReport, IntelReportLocationUnwound>(x => x.Locations)
                .Project(x => new LocationDto
                {
                    ItemId = x.Id,
                    ItemName = x.Name,
                    Name = x.Location.Name,
                    Latitude = x.Location.Point.Coordinates[1],
                    Longitude = x.Location.Point.Coordinates[0]
                })
                .ToListAsync();

Вот исходный класс отчета (но я взял некоторые вещи, которые не были ' здесь нужно)

 public class IntelReport
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
        public string ReportTitle { get; set; }
        public ICollection<Location> Locations { get; set; }

    }

и классы, которые, как мне показалось, мне нужно, чтобы сделать раскрутку ...

 public class LocationDto
    {
        [BsonRepresentation(BsonType.ObjectId)]
        public string ItemId { get; set; }
        public string ItemName { get; set; }
        public string Name { get; set; }
        public double? Longitude { get; set; }
        public double? Latitude { get; set; }
    }

    [BsonIgnoreExtraElements]
    public class IntelReportLocationUnwound
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }

        [BsonElement("ReportTitle")]
        [BsonIgnoreIfDefault]
        public string Name { get; set; }

        [BsonElement("locations")]
        [BsonIgnoreIfDefault]
        public LocationForAgg Location { get; set; }
    }

    public class LocationForAgg
    {
        [BsonElement("name")]
        [BsonIgnoreIfDefault]
        public string Name { get; set; }

        [BsonElement("point")]
        [BsonIgnoreIfDefault]
        public PointForAgg Point { get; set; }
    }

    public class PointForAgg
    {
        [BsonElement("coordinates")]
        [BsonIgnoreIfDefault]
        public double[] Coordinates { get; set; }
    }

1 Ответ

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

$ unwind преобразует массив вложенных документов в один вложенный документ, поэтому ваши данные после .Unwind<IntelReport, IntelReportLocationUnwound>(x => x.Locations) будут выглядеть следующим образом:

{ 
    "_id" : ObjectId("5e968bd5cc41498362cee2d2"), 
    "ReportTitle" : "aa", 
    "Locations" : { 
        "ItemId" : ObjectId("5e968bd5cc41498362cee2d3"), 
        "ItemName" : "Name", 
        "Name" : "N", 
        "Longitude" : 15, 
        "Latitude" : -24 
    } 
}

, что означает, что вы должны переосмыслить IntelReportLocationUnwound определение класса. Вы можете использовать тот же тип, который вы использовали в IntelReport, поскольку MongoDB преобразует его только из массива во вложенный объект:

public class IntelReportLocationUnwound
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("ReportTitle")]
    [BsonIgnoreIfDefault]
    public string Name { get; set; }

    [BsonElement("Locations")]
    [BsonIgnoreIfDefault]
    public Location Location { get; set; }
}

, затем вы можете изменить агрегацию:

.Project(x => new LocationDto
        {
            ItemId = x.Id,
            ItemName = x.Name,
            Name = x.Location.Name,
            Latitude = x.Location.Latitude,
            Longitude = x.Location.Longitude
        })
...