Я работаю над проектом, который подключается к серверу веб-сокетов, подписывается на обновления и вставляет / обновляет (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', как я могу удалить вложенный документ этого массива / объекта (он может очищать родительские поля, я такжехочу этого избежать).
Нужна ваша помощь.Заранее спасибо.