<を使用してドキュメントを直接フィルタリングできますか? code>ReferenceFieldの 単一のクエリのフィールド?
いいえ、 ReferenceFieldのフィールドでドキュメントを直接フィルタリングすることはできません これを行うには結合が必要であり、mongodbは結合をサポートしていません。
データベース参照に関するMongoDBドキュメントによると:
別の
したがって、1つのクエリで、両方でタスクをフィルタリングすることはできません。 特定のフラグ値と指定されたuser_id およびtask_id UserTasksで モデル。
フィルタリングを実行するにはどうすればよいですか?
必要な条件に従ってフィルタリングを実行するには、2つのクエリを実行する必要があります。
最初のクエリでは、タスクをフィルタリングしようとします 指定されたtask_idのモデル およびflag 。次に、2番目のクエリで、 UserTasksをフィルタリングします 指定されたuser_idのモデル およびtask 最初のクエリから取得。
例:
user_idがあるとしましょう 、 task_id 関連するタスクにflagがあるかどうかを確認する必要があります 0としての値 。
最初のクエリ
最初にmy_taskを取得します 指定されたtask_idを使用します およびflag 0として 。
my_task = Tasks.objects.get(task_id=task_id, flag=0) # 1st query
2番目のクエリ
次に、2番目のクエリで、 UserTaskでフィルタリングする必要があります 指定されたuser_idのモデル およびmy_task オブジェクト。
my_user_task = UserTasks.objects.get(user_id=user_id, tasks=my_task) # 2nd query
my_task を取得した場合にのみ、2番目のクエリを実行する必要があります 指定されたtask_idを持つオブジェクト およびflag 価値。また、一致するオブジェクトがない場合に備えて、エラー処理を追加する必要があります。
EmbeddedDocumentを使用した場合はどうなりますか タスクの場合 モデル?
タスクを定義したとしましょう EmbeddedDocumentとしてのドキュメント およびtasks UserTasksのフィールド EmbeddedDocumentFieldとしてのモデル 、次に、必要なフィルタリングを行うために、次のようなことを行うことができます。
my_user_task = UserTasks.objects.get(user_id=user_id, tasks__task_id=task_id, tasks__flag=0)
特定のmy_taskを取得する タスクのリストから
上記のクエリはUserTaskを返します すべてのタスクを含むドキュメント 。次に、目的のタスクを取得するために、ある種の反復を実行する必要があります。
そのために、 enumerate()を使用してリスト内包を実行できます。 。次に、目的のインデックスは、返される1要素リストの最初の要素になります。
my_task_index = [i for i,v in enumerate(my_user_task.tasks) if v.flag==0][0]