1

Python Flask を使用して JSON API でプラットフォームを開発しています。場合によっては、3 つのテーブルを結合する必要があります。ID の配列を使用してテーブルを結合する方法は、いくつかのガイダンスを提供してくれましたが、それ以上の解決策が必要です。

メッセージング アプリ用に 3 つのテーブルがあるとします。

  1. アカウント
  2. 会話
  3. メッセージ
  4. メッセージリーダー

アカウント テーブルのスニペット

{
    "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" のアカウント ドキュメントで get リクエストを受け取ったときに、以下のドキュメントを取得するためのマジック クエリは何ですか?」

{
    "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 のコードはすばらしいでしょう。

4

1 に答える 1

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)
于 2014-02-15T05:19:50.880 に答える