$addToSet с условием в MongoDB не работает со строками

#mongodb

#mongodb

Вопрос:

Я пытаюсь собрать список кодов ICD для следующего документа

 _id: "5facde3f9dXXXXXXX208",
EmpID: "MC20XXXXXXXXXX",
Coverage: "EMERGENCY"
DateLocked: 1900-01-01T00:00:00.000 00:00
CreatedBy: "ELIGIBILITY"
PlanCode: "1XXXXXXXXXXX"
GeneratedFrom: "1"
LoaType: ""
OpType:" "
Members:
Company:
ClaimsSummary:
ClaimsInfo:
Loa:
LoaDiagnosis:
    0:
        RecId:  1800XXXXXX
        Claimno:16XXXXXXXX
        Loa_No: "3XXXXXXXXX"
        IcdCode :   "S06.0"
        Diagnosis   :   "INTRACRANIAL INJURY: Concussion"
        FinalDiagnosis  :   " "
        ForPayStatus    :   " "
        CreatedBy   :   ""
        DateCreated :   1900-01-01T00:00:00.000 00:00
        ApprovedBy  :   ""
        DateApproved    :   1900-01-01T00:00:00.000 00:00
        CancelledBy :   ""
        DateCancelled   :   1900-01-01T00:00:00.000 00:00
        ProcessedBy :   ""
        DateProcessed   :   1900-01-01T00:00:00.000 00:00
        GPBatchNo:  ""
        Coverage: "N"
        RelatedIcd: ""
        CronicIllness:
            IcdGroupCode: "S06"
            IcdGroupDesc:"INTRACRANIAL INJURY"
            ChronicIllnessTagging:"N"
    1:
        RecId:  1800XXXXX
        Claimno:16XXXXXXXX
        Loa_No: "3XXXXXXXXX"
        IcdCode :   "S00.0"
        Diagnosis   :   "SUPERFICIAL INJURY OF HEAD: Superficial injury of scalp"
        FinalDiagnosis  :   " "
        ForPayStatus    :   " "
        CreatedBy   :   ""
        DateCreated :   1900-01-01T00:00:00.000 00:00
        ApprovedBy  :   ""
        DateApproved    :   1900-01-01T00:00:00.000 00:00
        CancelledBy :   ""
        DateCancelled   :   1900-01-01T00:00:00.000 00:00
        ProcessedBy :   ""
        DateProcessed   :   1900-01-01T00:00:00.000 00:00
        GPBatchNo:  ""
        Coverage: "N"
        RelatedIcd: ""
        CronicIllness:
            IcdGroupCode: "S00"
            IcdGroupDesc:"SUPERFICIAL INJURY OF HEAD"
            ChronicIllnessTagging:"N"
LoaCpt:
LoaPhysician:
PhysicianBill:
 

Конвейер, который я сделал до сих пор, это:

 [{$group: {
  _id: "$EmpID",
  LOS: {
            $sum: {
                $cond: { 
                    if: { $gt: [ { $divide: [ { $subtract: [ "$DischargeDate", "$AdmissionDate" ] }, 24*60*60*1000 ] }, 0 ] },
                    then: { $divide: [ { $subtract: [ "$DischargeDate", "$AdmissionDate" ] }, 24*60*60*1000 ] },
                    else: 0
                }
            } 
        },
 icds_chronic: { 
            $addToSet: { 
                $cond: { 
                  **  if: { $eq: [ "$LoaDiagnosis.CronicIllness.ChronicIllnessTagging", "Y" ] }, **
                    then: "$LoaDiagnosis.IcdCode",
                    else: "$REMOVE"
                }
           }
        },
}}, {$sort: {
  LOS: -1
}}]
 

Однако условие внутри addToSet не работает. Я получаю пустой массив в качестве результата для icds_chronic. Я полагаю, что проблема может быть связана с символом ‘Y’. Любые другие указатели были бы полезны. Я использую mongo версии 4.1

Ответ №1:

Это трудно понять, потому что отсутствуют поля и т.д. В принципе, добавьте $unwind в свой конвейер.

 [{$unwind:"$loaDiagnosis"}, 
{$group: {
  _id: "$EmpID",
  LOS: {
            $sum: {
                $cond: { 
                    if: { $gt: [ { $divide: [ { $subtract: [ "$DischargeDate", "$AdmissionDate" ] }, 24*60*60*1000 ] }, 0 ] },
                    then: { $divide: [ { $subtract: [ "$DischargeDate", "$AdmissionDate" ] }, 24*60*60*1000 ] },
                    else: 0
                }
            } 
        },
 icds_chronic: { 
            $addToSet: { 
                $cond: { 
                  **  if: { $eq: [ "$LoaDiagnosis.CronicIllness.ChronicIllnessTagging", "Y" ] }, **
                    then: "$LoaDiagnosis.IcdCode",
                    else: "$REMOVE"
                }
           }
        },
}}, {$sort: {
  LOS: -1
}}]
 

Если вы не хотите видеть пустой массив перед $sort добавлением, добавьте этот этап

{$match:{ "icds_chronic":{$elemMatch:{ $exists:true } }}}

Я написал упрощенную версию для воспроизведения