<を使用してドキュメントを直接フィルタリングできますか? 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]