GoにおけるDatastoreクエリのFilter(不等式)とDistinctOnを同時に使う方法
抽出したいEntityはStatusがdone、AgentIDがagentID(変数)
UserIDがユニークでありTagが learn < Tag < mathを満たすようなもの。
※ UserIDをユニークなものにする為にCreatedAtでOrderして一番初めのものを取得すればいいと考えています。
そのため以下のようなクエリを作成したい。
q := datastore.NewQuery("Task").
Filter("Status =", "done").
Filter("AgentID =", agentID).
Filter("Tag >", "learn").
Filter("Tag <", "math").
DistinctOn("UserID")
しかしエラーは起きないもののDistinctOnが動作しないので
q := datastore.NewQuery("Task").
Filter("Status =", "done").
Filter("AgentID =", agentID).
Project("UserID", "Tag").
DistinctOn("UserID").
Filter("Tag >", "learn").
Filter("Tag <", "math")
のようにProjectを使用してからではないとDistinctOnが動作しない。
しかしこのようにしてしまうとTagをDistinctOnに入れろとエラーが起きるので期待通りのクエリを作成することができない。(DistinctOn("UserID", "Tag")とすればエラーは消えるがUserIDが
ユニークにならなくなる)
考えられる解決策としては
・ Projectを使わずにDistinctOnを使えるようにする。
・ Filter(不等式)を使ってもProject、DistinctOnに入れなくてよいようにする。
datastoreでこのようなCountをする操作はナンセンスだとは承知の上ですが、
もし解決例があれば教えて頂きたいです...。
GCP Datastoreドキュメント
https://cloud.google.com/datastore/docs/concepts/queries?hl=ja#datastore-datastore-distinct-on-query-go