1

そこで、最新の RethinkDB (1.14) を使用して Python 2.7 で作業しているいくつかのコードの楽しい縮小スニペットを次に示します。私の問題は、別の条件を追加する必要があることです。可能な組み合わせが多すぎます。これは単一のフィルターステートメントで実行できますか?

query = r.table('messages').order_by(r.desc('created'))
if tag is not None and read is not None:
    query = query.filter(lambda n: (n['user_id'] == user_id) &
                           (n['tags'].contains(tag)) &
                           (n['read'] == read))
elif read is not None:
    query = query.filter(lambda n: (n['user_id'] == user_id) &
                           (n['read'] == read))
elif tag is not None:
    query = query.filter(lambda n: (n['user_id'] == user_id) &
                           (n['tags'].contains(tag)))
else:
    query = query.filter(lambda n: n['user_id'] == user_id)
fields_list = query.skip(skip)\
                   .limit(limit)\
                   .run(g.db_conn)

補足として、連鎖フィルターが機能し、基本的に として機能する場合、これは非常に簡単になりますand。しかし、今のところ、RethinkDB クエリごとに 1 つのフィルターしか持てないようです。

編集:以前に何が起こっていたのかはわかりませんが、フィルターの連鎖は機能します。

4

1 に答える 1

1

これが実際に機能することがわかりました!

def _(n):
    return (n['user_id'] == user_id) & \
           (n['tags'].contains(tag) if tag is not None else True) & \
           (n['read'] == read if read is not None else True)
query = r.table('messages') \
         .order_by(r.desc('created')) \
         .filter(_) \
         .skip(skip)\
         .limit(limit)
fields_list = query.run(g.db_conn)

編集:また可能:

query = r.table('messages') \
         .order_by(r.desc('created')) \
         .filter(r.row['user_id'] == user_id) \
         .filter(r.row['tags'].contains(tag) if tag is not None else True) \
         .filter(r.row['read'] == read if read is not None else True) \
         .skip(skip) \
         .limit(limit)
fields_list = query.run(g.db_conn)
于 2014-08-30T21:56:21.440 に答える