RethinkDB:​​如何对三个表进行递归连接?

时间:2014-02-15 04:36:21

标签: rethinkdb rethinkdb-python

我正在使用Python Flask开发一个带有JSON API的平台。在某些情况下,我需要加入三个表。 How to join tables with a array of IDs给了我一些指导,但我需要一个超越它的解决方案。

假设我们有三个表用于消息传递应用程序。

  1. 帐户
  2. 会话
  3. 消息
  4. 留言读者
  5. 帐户表格代码段

    {
        "id": "account111",
        "name": "John Doe",
    },
    

    对话表格代码段

    {
        "id": "conversation111",
        "to": ["account111", "account222", "account333"], // accounts who are participating the conversation
        "subject": "RethinkDB",
    }
    

    消息表格片段

    {
        "id": "message111",
        "text": "I love how RethinkDB does joins.",
        "from": "account111", // accounts who is the author of the message
        "conversation": "conversation111"
    }
    

    消息读者表摘录

    {
        "id": "messagereader111",
        "message": "message111",
        "reader": "account111",
    }
    

    我的问题是“当我收到ID为”account111“的帐户文档的获取请求时,获取下面文档的神奇查询是什么?”

    {
        "id": "account111",
        "name": John Doe,
        "conversations": [            // 2) Join account table with conversations
            {
               "id": "conversation111",
               "name": "RethinkDB",
               "to": [                     // 3) Join conversations table with accounts
                   {
                        "id": "account111",
                        "name": "John Doe",
                   },
                   {
                        "id": "account222",
                        "name": "Bobby Zoya",
                   },
                   {
                        "id": "account333",
                        "name": "Maya Bee",
                   },
               ]
               "messages": [        // 4) Join conversations with messages
                   {
                       "id": "message111",
                       "text": "I love how RethinkDB does joins.",
                       "from": {        // 5) Join messages with accounts
                            "id": "account111",
                            "name": "John Doe",
                       },
                       "message_readers": [
                           {
                               "name": "John Doe",
                               "id": "account111",
                           }
                       ],
                   },
               ],
            },
        ],
    }
    

    任何指导或建议都会很棒。 JavaScript或Python代码非常棒。

1 个答案:

答案 0 :(得分:4)

我很难理解你想要的东西(你有多个id为111的文件),但我认为这是你正在寻找的查询

Python查询:

r.table("accounts").map(lambda account: 
    account.merge({
        "conversations": r.table("conversations").filter(lambda conversation: 
            conversation["to"].contains(account["id"])).coerce_to("array").map(lambda conversation:
            conversation.merge({
                "to": conversation["to"].map(lambda account: 
                    r.table("accounts").get(account)).pluck(["id", "name",]).coerce_to("array"),
                "messages": r.table("messages").filter(lambda message:
                    message["conversation"] == conversation["id"]).coerce_to("array").map(lambda message:
                    message.merge({
                        "from": r.table("accounts").get(message["from"]).pluck(["id", "name",]),
                        "readers": r.table("message_readers").filter(lambda message_reader:
                            message["id"] == message_reader["message"]).coerce_to("array").order_by(r.desc("created_on")),
                    })).order_by(r.desc("created_on"))
            })).order_by(r.desc("modified_on"))
    })).order_by("id").run(db_connection)