Обновляйте массив провайдеров и счетчик приращений, только если в Document нет идентификатора провайдера - PullRequest
0 голосов
/ 27 мая 2019

Я застрял в такой ситуации.У меня есть следующий документ.

{
    "_id" : ObjectId("5ceba7c419b48423e452972a"),
    "userId" : ObjectId("5ceba7c419b48423e4529727"),
    "providers" : [ 
        "1689736266", 
        "1598763690", 
        "1528069614", 
        "1831364272", 
        "1548463045", 
        "1245301159", 
        "1386616399", 
        "1790775971", 
        "1629462130", 
        "1992169783"
    ],
    "countByType" : {
        "doctors" : 6,
        "labs" : 0,
        "hospitals" : 0,
        "imagingCenters" : 0,
        "other" : 4
    }
}

Изначально я извлекаю массив providerArray из упругого поиска, добавлял его в массив провайдеров и увеличивал число с помощью следующего запроса.

let updateProviderId = await userProviderCollection.update(
   regUserId, {
     $set:  {
       providers: combinedProviderArray,
       countByType: providerCountType
     }
});

где комбинированныйProviderArrayэто комбинированный массив провайдеров.ProviderId создается при создании нового отчета.Вышеуказанное условие будет работать, если отчеты уже есть.Но когда приходит новый отчет, мне нужно проверить массив провайдеров и увеличить счетчик, если не в массиве, иначе ничего не делать.Как этого добиться.

Пожалуйста, смотрите код ниже, когда отчет с providerId уже находится в массиве.

// Searching for Providers in Elastic Search
   let searchForProviders = await esHelper.getProvidersById(combinedProviderArray, true);
   searchForProviders.forEach((getCategory) => {
     let prCategory = getCategory.category;
     prCategory.forEach((cat) => {

       // Combining categories
       categoryArray = categoryArray.concat(cat);
     });
   });

   let counts = {
     "doctor": 0,
     "laboratory": 0,
     "hospital": 0,
     "imagingcenter": 0,
     "other": 0
   };
   let x;
   categoryArray.forEach(function(x) {
     counts[x] = (counts[x] || 0)+1;
   });

   let providerCountType = {
     "doctors": counts.doctor,
     "labs": counts.laboratory,
     "hospitals": counts.hospital,
     "imagingCenters": counts.imagingcenter,
     "other": counts.other
   }


   // Updating npiId & category count
   userproviderData.getDataSource().connector.connect(async (err, db) => {
     let userProviderCollection = db.collection("UserProviders");
     let regUserId = { userId: userId};
     let updateProviderId = await userProviderCollection.update(
       regUserId, {
         $set:  {
           providers: combinedProviderArray,
           countByType: providerCountType
         }
       });
   });

Пожалуйста, предоставьте соответствующее решение для того же.Любая помощь могла бы быть полезна.Я застрял на том, как добавить провайдера в массив и увеличить счетчик в соответствии с этим.

1 Ответ

1 голос
/ 27 мая 2019

Вместо того, чтобы каждый раз перестраивать массив, вы можете использовать $addToSet.Это приводит к добавлению значения в массив, но только если его еще нет ...

let updateProviderId = await userProviderCollection.update(
   regUserId, {
     $addToSet:  {
       providers: providerID
     }
});

Что касается подсчетов, это можно сделать аналогично, используя $ inc.

let updateProviderId = await userProviderCollection.update(
   regUserId, {
     $inc:  {
       "countByType.doctors": 1
     }
});

Вы можете легко построить свой объект приращения:

let $inc= {
  "countByType.doctors": counts.doctor,
  "countByType.labs": counts.laboratory,
  "countByType.hospitals": counts.hospital,
  "countByType.imagingCenters": counts.imagingcenter,
  "countByType.other": counts.other
}
let updateProviderId = await userProviderCollection.update(regUserId, {$inc});

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

let $inc = {};
$inc["countByType."+categoryName] =  1;
let updateProviderId = await userProviderCollection.update(
   regUserId, {
     $addToSet:  {
       providers: providerID
     },
     $inc
});

Но это увеличило бы количество, даже если провайдер уже присутствовал ... Поэтому вам нужно проверить, работает ли $ addToSet, а затем выполнить приращение:

let updateProviderId = await userProviderCollection.update(
   regUserId, {
     $addToSet:  {
       providers: providerID
     }
});
if(updateProviderId["nMatched"] === 1 //A document was matched
    && updateProviderId["nModified"] === 1 //A document was modified
){
    let updateProviderCount = await userProviderCollection.update(regUserId, {$inc});
}
...