sql >> データベース >  >> NoSQL >> MongoDB

Mongo埋め込みドキュメントクエリ

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


    1. ApacheHBaseスナップショットの概要

    2. Android Studio:MongoJavaDriverを使用してMongoDBサーバーに接続する

    3. RedisセンチネルDockerイメージ/Dockerfile

    4. 配列をredisに保存するにはどうすればよいですか?