1

我有收藏朋友

- userId: user id
- Friends: array of user ids

用户

- _id: userId
- Last Login
- Other User info fields

如果用户正在浏览我的网站,则上次登录字段每 5 分钟更新一次。

现在我有逻辑,我从朋友集合中获取朋友的用户 ID,然后使用该 ID 查询用户集合以获取用户信息。

添加:此外,在未来的版本中,我会添加用户不仅可以添加用户,还可以添加其他集合中的宠物,因此朋友嵌入数组看起来像 {UserId, PetId}

但是对于下一个版本,我想添加新功能,我将显示按上次登录排序的朋友。

我认为可行的解决方案

  1. Map reduce on select - 易于实现,但可能会出现性能问题
  2. Map reduce on update - 在这种情况下,我可能会使用属性“out”在每次更新时写入新集合,所以我将拥有新集合Friend.reduced以及我需要的所有信息,然后我可以通过索引轻松查询它
  3. 将新属性 Last Update 添加到 Friends 列表集合,使其看起来像 {FriendId, LastUpdate} 逻辑很容易在业务级别上实现。

还有什么其他选择可以解决我的问题?

4

1 回答 1

1

像下面这样的简单查询不起作用?

var someId = ObjectId("52758653cbd6ca816ca0ee1b")
var friends = db.friends.findOne({"userId": someId}, {"_id": 0, "friends": 1}).friends

db.users.find(
    {_id: {$in: friends }}
).sort({lastLogin: -1})
于 2013-11-02T23:12:11.603 回答