【问题标题】:Ideas how to query two collections in mongodb如何在mongodb中查询两个集合的想法
【发布时间】:2013-11-03 16:32:36
【问题描述】:

我有收藏朋友

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

以及用户

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

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

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

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

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

我认为可行的解决方案

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

还有哪些其他方法可以解决我的问题?

【问题讨论】:

    标签: mongodb


    【解决方案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})
    

    【讨论】:

    • 这也是一个想法,但最复杂的是,在我的项目中,朋友不仅是用户 :) 他们也是宠物。 :)
    • 好吧,我只是想,但这个解决方案可能会起作用,因为宠物有主人,而这个主人是用户 ID,所以朋友数组将有对象 {UserId, PetId - 这将是可空的} 然后我可以轻松排序,如果朋友被添加为宠物,我会得到关于宠物的信息。
    • 您能否在问题中添加一些详细信息。它确实看起来像一个简单查询的工作,不清楚为什么要使用 map-reduce。
    • 完成,是的,你是对的,它可以使用两个查询,获取所有 id,然后使用该 id 我可以对用户集合进行排序,其余部分将在我的代码中完成。
    • 我还有一个问题,如何在存储过程之类的东西中进行请求?我已阅读有关 eval 和 javascript 函数的信息,但两者都有限制或不推荐。因为在我的情况下,我正在做请求,它返回让我们说 100 个用户 ID,然后是第二个请求,所以我担心的是,如果我有 1000 个或更多朋友,它可能会对性能产生一些影响......
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2012-05-11
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多