Подтвердите ответы websocket на MongoDb с помощью Node.js - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю над проектом, который подключается к серверу веб-сокетов, подписывается на обновления и вставляет / обновляет (upsert) их.Ответы Websocket имеют формат JSON и огромные данные.Иногда я получаю около 60 обновлений в минуту.

Я пытался получить каждый ключ и значение в foreach, но у меня были проблемы со скоростью / производительностью.Затем я обнаружил, что форматы Json можно вставлять в MongoDB.Я использовал запрос updateOne с опцией upsert для вставки ответа веб-сокета в базу данных

dbo.collection("cinemas").updateOne( 
    {"id": countryId} , 
    { $set: websocketData }, 
    {upsert: true} 
);

Этот код вставляет новые страны и вложенные документы (города, фильмы) идеально, но ответ обновления создает проблему.Когда количество просмотренных фильмов показывается как обновление, оно обновляет это поле, но очищает все остальное.

Я использую mongodb (не mongoose)

Коллекция "кинотеатров" похожа на

{
  _id: ObjectId("5bb0be67cf6f4c8b060802d0")
  id: 15243846   <-- country id
  country: "France"
  cities:
  {
     556677:
     {
        id: 556677
        city: "Paris"
        movies:
        {
           987654321:
           {
              id: 987654321
              name: "James Bond 007"
              seen: 1254785
              category: "action"
           }
           ... <- other movies
        }
     }
     ... <- other cities
  }
}


ответ на обновление веб-сокета со значением (видимое число будет обновлено):

{
  id: 15243846  <-- country id
  cities:
  {
    556677:
    {
      movies:
        {
          987654321:
          {
            seen: 1304289
          }
        }
    }
  }
}


ожидаемый результат:

{
  _id: ObjectId("5bb0be67cf6f4c8b060802d0")
  id: 15243846   <-- country id
  country: "France"
  cities:
  {
     556677:
     {
        id: 556677
        city: "Paris"
        movies:
        {
           987654321:
           {
              id: 987654321
              name: "James Bond 007"
              seen: 1304289   <---- UPDATED FIELD
              category: "action"
           }
           ... <- other movies
        }
     }
     ... <- other cities
  }
}


что я получаю:

{
  _id: ObjectId("5bb0be67cf6f4c8b060802d0")
  id: 15243846   <-- country id
  cities:
  {
     556677:
     {
        movies:
        {
           987654321:
           {
              seen: 1304289
           }
        }
     }
  }
}



А также иногда я получаю ответ websocket с нулевым значением

{
  id: 15243846  <-- country id
  cities:
  {
    556677: null
  }
}

ожидаемый результат

{
  _id: ObjectId("5bb0be67cf6f4c8b060802d0")
  id: 15243846   <-- country id
  country: "France"
  cities:
  {
     556677: null  <-- (or completely remove this city)
     ... <- other cities
  }
}


Я искал в Google, пробовал различные коды, но не мог найти способ.
- Позволяет ли мне MongoDb делать это без использованиядля каждого?Или я должен использовать mongoose, чтобы сделать это лучше для повышения производительности?
- Когда я получаю ответ со значением 'null', как я могу удалить вложенный документ этого массива / объекта (он может очищать родительские поля, я такжехочу этого избежать).

Нужна ваша помощь.Заранее спасибо.

...