V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HyperSimon
V2EX  ›  程序员

请教, mongodb 的连表查询

  •  1
     
  •   HyperSimon · 2019-05-10 23:06:32 +08:00 · 1818 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学,不,初用 mongodb,日常的增删改查没啥问题,现在遇到一个比较棘手的问题想来资讯一下大家。

    我有两张表,user 表和 article 表。如下图所示👇 表示意

    如何查询出 article 表中 publish_time 大于 author.mid 与 user 表当中 mid 对应的 user 的 time 的 数据?

    上面的说法可能有点绕,分步骤就是我想:

    1. 查询出与 article 对应的 user
    2. 得到对应 user 的 time
    3. 找出 article.publish_time 大于 user.time 的数据。

    如果可以,最好有上述实现的 mogodb(mongo shell 写法?) 写法和 python(pymongo) 写法。

    以及现在瞎写的一些语句,纯小白,轻喷。 mongodb

    rbe
        1
    rbe  
       2019-05-10 23:28:52 +08:00
    没有看懂你想查什么。首先得说明一下字段含义吧,比如 user 表里那个时间是注册时间吗;然后得说清楚你手上有什么数据,希望得到什么数据。mid 和 publish_time 是已知字段吗?需求是“查出某用户注册后发表的文章”?
    HyperSimon
        2
    HyperSimon  
    OP
       2019-05-10 23:33:40 +08:00
    @rbe 不好意思没有描述清楚,

    user:
    mid -- 用户 id, 8 位数字
    time -- 用户手机号码通过验证的时间戳,没有验证手机号码的用户也可以发文章

    article:
    author.mid -- 发帖用户 id
    publish_time -- 发布帖子的时间戳

    上面四条字段除了 time 可能为 0(空)其他都是已知字段,需求是“查询用户在验证手机号码后发布的文章”
    brickyang
        3
    brickyang  
       2019-05-10 23:39:26 +08:00 via iPhone
    最简单的做法是查两次,先查一次用户,再查一次文章集合,效率可能比 aggregate 还高。
    HyperSimon
        4
    HyperSimon  
    OP
       2019-05-10 23:44:01 +08:00
    @brickyang 纯小白,那个是我瞎写的
    rbe
        5
    rbe  
       2019-05-10 23:44:34 +08:00
    查两次+1,这样比较简单。这类操作没必要写个复杂的 aggregate 吧?
    c4f36e5766583218
        6
    c4f36e5766583218  
       2019-05-11 04:00:10 +08:00
    select a.* from article a join user u on a.`author.mid`=u.mid where a.publish_time>u.time;
    acehow
        7
    acehow  
       2019-05-11 07:54:57 +08:00 via Android
    既然是“查询用户在验证手机号码后发布的文章。那认为你知道用户 id 是个传入参数。根据用户 id 分别查两个表得得到各自的时间,然后扔个数据结构里再比较就好了。
    acehow
        8
    acehow  
       2019-05-11 07:59:32 +08:00 via Android
    就是先传入用户 id,根据 id 查到他的手机注册时间。然后再去 article 表查晚于这个时间的该用户的文章数。分两步走就可以了。
    HyperSimon
        9
    HyperSimon  
    OP
       2019-05-11 10:40:21 +08:00
    @acehow 谢谢,用了上面的建议查了两次,您的写法我也去研究下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:54 · PVG 04:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.