Сортировка MongoDB не работает должным образом в C# с агрегатным поискомC#

Место общения программистов C#
Ответить
Anonymous
 Сортировка MongoDB не работает должным образом в C# с агрегатным поиском

Сообщение Anonymous »

Я пытаюсь отсортировать список в MongoDB с помощью C# следующим методом:
public async Task Search(SearchRequestDTO searchRequestDTO, string tenantId)
{
var filterDefinition = GetSearchFilter(searchRequestDTO, tenantId);

var totalItems = await mongoCollection.CountDocumentsAsync(filterDefinition);
var itemsWithLookup = await mongoCollection.Aggregate()
.Match(filterDefinition)
.As()
.Lookup(campaignCollection,
campaignvalidate => campaignvalidate.CampaignId,
foreignfield => foreignfield.Id,
@as => @as.Campaigns)
.AppendStage("{ $sort: { 'Campaigns.CreatedDate': -1 } }")
.Skip(searchRequestDTO.Pagination.Offset)
.Limit(searchRequestDTO.Pagination.Limit)
.ToListAsync();

return new SearchResponseDTO
{
TotalItems = (int)totalItems,
Items = itemsWithLookup
};
}

Однако сортировка не работает должным образом. Вот пример возвращаемого JSON:
{
"totalItems": 2,
"items": [
{
"id": "ec6cb5bf-e493-4bed-9f3b-295908dc0b2a",
"campaignId": "7425739c-8f4f-4bd7-8004-d14a47bcc093",
"campaign": {
"name": "Campaign A",
"site": "",
"periodDate": {
"from": "2024-05-20T03:00:00Z",
"to": "2024-05-21T03:00:00Z"
},
"rule": {
"ruleType": 2,
"multipleReachValueCondition": {
"reachValue": {
"value": 98,
"type": 0
}
}
},
"rules": [],
"prize": {
"prizeType": 1,
"multipleDiscount": {
"discount": {
"type": 1,
"value": 100
}
}
},
"prizes": [],
"notificationLayoutId": "599ddbed-05ef-4526-918f-4e7bd4bb022c",
"participantBaseId": "e2cafb8d-4f0b-4706-a3a6-68bb52f0dbce",
"status": 4,
"whatsAppType": "default",
"isApp": false,
"layoutType": "default",
"engajamentSelected": 1,
"createdDate": "2024-05-20T21:21:14.518Z",
"nextEngajament": 0,
"isSegmentationCampaign": false,
"isRanking": false,
"segmentations": [],
"campaignDetails": [],
"notificationDetails": []
},
"validations": [],
"currentStatus": 0
},
{
"id": "132ea76c-2887-4d49-8709-69d7c8bd5a58",
"campaignId": "e9c28236-ade0-4085-96f9-1fba41b339a0",
"campaign": {
"name": "Campaign B",
"site": "",
"periodDate": {
"from": "2024-05-21T03:00:00Z",
"to": "2024-06-21T03:00:00Z"
},
"rule": {
"ruleType": 0,
"reachPurchaseValue": {
"value": 1000,
"type": 0
}
},
"rules": [],
"prize": {
"prizeType": 0,
"discount": {
"type": 1,
"value": 10
}
},
"prizes": [],
"tearmsOfServiceId": "41e7e855-4cc4-475c-aae3-e9e3b0394b15",
"notificationLayoutId": "1e19d321-94fc-4e6f-b8d1-b05d5e0d176f",
"participantBaseId": "91ecf2a2-c8ea-42d0-9246-f84072c6cc3c",
"status": 1,
"whatsAppType": "",
"isApp": false,
"layoutType": "custom",
"engajamentSelected": 0,
"createdDate": "2024-05-21T13:29:50.859Z",
"nextEngajament": 0,
"isSegmentationCampaign": false,
"isRanking": true,
"segmentations": [],
"campaignDetails": [],
"notificationDetails": []
},
"validations": [],
"currentStatus": 0
}
],
"nextEngajament": 0
}

В этом примере вы можете видеть, что первая возвращаемая запись относится к 20-му, а не к 21-му числу.
Что я получил Пробовал
  • сортировку внутри AppendStage с помощью "{ $sort: {
    'Campaigns.CreatedDate': -1 } }".
  • Убедилось, что поле CreatedDate правильно заполнено и используется при
    сортировке.
Почему сортировка не работает должным образом и как я могу гарантировать, что результаты правильно отсортированы по полю CreatedDate в порядке убывания?
Любые рекомендации или примеры того, как правильно сортировать результаты после выполнения поиска, будут с благодарностью приняты .
ОБНОВЛЕНИЕ:
CampaignValidateDTO
using Project.CrossCutting.DTO.Campaign;
using Project.CrossCutting.Enum;
using System.Text.Json.Serialization;

namespace Project.CrossCutting.DTO.CampaignValidate
{
public class CampaignValidateDTO
{
public string Id { get; set; }
public string Type { get; set; }
public string CampaignId { get; set; }
[JsonIgnore]
public List Campaigns { get; set; }
public CampaignDTO Campaign { get => Campaigns?.FirstOrDefault(); }
public List Validations { get; set; }
public CampaignValidationType CurrentStatus { get; set; }

}
}

CampaignDTO
using Project.CrossCutting.Enum;

namespace Project.CrossCutting.DTO.Campaign
{
public class CampaignDTO
{
public string Name { get; set; }
public string Site { get; set; }
public AvailabilityDateDTO PeriodDate { get; set; }
public RuleDTO Rule { get; set; }
public List Rules { get; set; }
public PrizeDTO Prize { get; set; }
public List Prizes { get; set; }
public string TearmsOfServiceId { get; set; }
public string NotificationLayoutId { get; set; }
public string ParticipantBaseId { get; set; }
public CampaignStatus? Status { get; set; }
public string WhatsAppType { get; set; }
public bool IsApp { get; set; }
public string LayoutType { get; set; }
public string ProgramId { get; set; }
public string ProgramName { get; set; }
public string Logo { get; set; }
public string AspectRatio { get; set; }
public int EngajamentSelected { get; set; }
public DateTime CreatedDate { get; set; }
public int NextEngajament { get; set; }
public string Qtd { get; set; }
public bool IsSegmentationCampaign { get; set; }
public bool IsRanking { get; set; }
public List Segmentations { get; set; }
public List Imgs { get; set; }
//public string SegmentationBaseId { get; set; }
public List CampaignDetails { get; set; }
public List NotificationDetails { get; set; }
}

}


Подробнее здесь: https://stackoverflow.com/questions/785 ... ate-lookup
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»