Оффлайн первое реагирование нативного приложения (nodejs, mongodb) - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать (сначала автономное) приложение для чата с реагированием на родную (и nodeJS, mongoDB, socketIO).

Я хочу спросить, каков наилучший (оптимизированный) способ поиска друзей list.

структура моей модели пользователя:

mongoose.Schema({
    phoneNumber: Number,
    friends: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }],
})

as json

[
    {
        "_id": ObjectId("5e91bcd6cd1630213d95f810"),
        "phoneNumber": "+995555555555",
        "friends": [
            ObjectId("5e57d64d92cc878760086980"),
            ObjectId("5e57d64d92cc878760086981")
        ]
    },
    ...
]

Мой текущий подход заключается в получении списка друзей из API и сохранении в localStorage, когда пользователь загружает приложение. Таким образом, пользователь может видеть список друзей, даже если он не в сети.

И меня беспокоит то, что если в списке друзей 1000 пользователей и у них 200 пользователей, это будет дорогой звонок.

Я могу Обновлять localStorage можно только тогда, когда пользователь добавляет друга, но пользователь не сможет увидеть, изменит ли друг свой аватар или имя пользователя и т. д. c ..

Итак, каков наилучший способ сохранить актуальный список друзей?

1 Ответ

2 голосов
/ 16 апреля 2020

Возможно, вы могли бы изменить свою структуру, чтобы иметь коллекцию Connections, в которой хранится пара пользовательских идентификаторов. Я не могу сказать, что это было бы более оптимальным, но это оставило бы вам больше возможностей для расширения, например, это поддержало бы наличие типов соединений, некоторые соединения могли бы быть друзьями, другие могли быть из цепочек сообщений между людьми, которые не являются друзьями, не уверен как бы вы это ни называли, но в качестве примера рассмотрите что-то вроде запросов сообщений в мессенджере Facebook.

Еще одним преимуществом этого является то, что он останавливает создание случайного мегадо c, поскольку чей-то список друзей становится все больше и больше. Это также означает, что когда вы выбираете друга-друга, выполняете c, вы также не будете извлекать друзей-друзей, возможно, именно здесь вы ищете оптимизацию.

Соединения могут выглядеть примерно так :

{
    instigator: ObjectId("5e91bcd6cd1630213d95f810"),
    subordinate: ObjectId("5e57d64d92cc878760086980"),
    type: 'friendship'
}

{
    instigator: ObjectId("5e91bcd6cd1630213d95f810"),
    subordinate: ObjectId("5e57d64d92cc878760086981"),
    type: 'friendship'
}

, чтобы представить две дружбы в вашем примере.

Чтобы получить друзей одного пользователя, вы бы запросили что-то вроде Connections.find({ users: ObjectId('5e91bcd6cd1630213d95f810'), type: 'friendship' })

Вы можете использовать агрегат или мон goose заполнить, чтобы обменять userIds для своих документов, прежде чем возвращать их в клиент.

...