【问题标题】:Offline first react native application (nodejs, mongodb)离线第一反应原生应用(nodejs、mongodb)
【发布时间】:2020-04-16 11:44:23
【问题描述】:

我正在尝试使用 react native(和 nodeJS、mongoDB、socketIO)构建(离线优先)聊天应用程序。

我想问一下获取好友列表的最佳(优化)方式是什么。

我的用户模型结构:

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

作为 json

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

我目前的方法是在用户启动应用程序时从 api 获取好友列表并保存到 localStorage。因此,即使用户处于离线状态,用户也可以查看好友列表。

我担心的是,如果有 1000 个用户,而他们的好友列表中有 200 个用户,那么通话费用会很高。

我只能在用户添加朋友时更新localStorage,但用户将无法看到朋友是否更改了他们的头像或用户名等。

那么,保持最新朋友列表的最佳方式是什么?

【问题讨论】:

  • 嘿@Kakajann 你有什么进展吗?

标签: node.js mongodb react-native offline-caching


【解决方案1】:

也许您可以更改您的结构以拥有一个存储一对 userId 的 Connections 集合。我不能说这会更优化,但它确实为您留出了更多的扩展空间,例如这将支持连接类型,一些连接可能是朋友,其他可能来自非朋友之间的消息链,不确定你会这样称呼它,但以 Facebook Messenger 中的消息请求为例。

这样做的另一个好处是它可以防止您在某人的朋友列表越来越大时创建意外的巨型文档。这也意味着当您获取朋友用户文档时,您不会同时获取该朋友的朋友,也许这就是您正在寻找的优化所在。

连接可能如下所示:

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

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

在你的例子中代表两个友谊。

要获取某个用户的朋友,您可以查询 Connections.find({ users: ObjectId('5e91bcd6cd1630213d95f810'), type: 'friendship' }) 之类的内容

在将用户 ID 返回给客户端之前,您可以使用聚合或猫鼬填充将用户 ID 换成他们的文档。

【讨论】:

  • 嗨。我决定去参加朋友聚会……就像分页一样。例如:假设一个用户有 200 个朋友。我将它们全部保存在 localStorage 中。当用户启动应用程序时,我只获取前 10 个朋友,并在 localStorage 中更新前 10 个朋友。并在用户滚动时继续获取其余部分。我认为这是保持数据最新的最佳方式。我还检查了whatsapp和电报。他们不会立即更新头像等。滚动时更新时间很少。
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2021-07-12
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多