公式のC#ドライバを使用して、エンベデッドアレイから1つの要素を選択する方法。ベストプラクティス?

このドックフォームでは、私は 埋め込み配列からの単一の参加者オブジェクト

{
    _id: someCourseId,
    CourseName: "someName",
    Participants[
        {UserId: X Name: "person1"},
        {UserId:Y, Name:"person2"},
        {UserID:Z, Name:"person3"}
    ]
}

正式なC#シャープドライバでクエリを書くにはどうすればいいですか? ユーザID Yの埋め込み配列要素を返しますか?

今、私は、IDがYの参加者を持つコースを選択できます Query.EQ( "Participants.UserId"、Y)を使用すると、 CourseオブジェクトのParticipantsフィールドを使用して SetFields( "Participants")、この配列が巨大なら、私はしたくない 配列全体を取り出しますが、要素は1つだけです。これは可能ですか?

そうでない場合は、埋め込みを使用しないことをお勧めします 特定の要素をフェッチする必要がある場合の配列 代わりに、配列値を保持するために別のコレクションを使用する必要があります RDBMSのように "ルートドックへの外部キー"があります。 つまり、私の例では、Participantsコレクションを作成しました。 各ドックはコースのIDを保持します。同意しますか?

1

2 答え

このようにスライスを使用することができます:

//it will skip 0 elements and load only one element from nested array
 var slice = Fields.Slice("Participants", 0, 1); 

また、mongodbは常にルートドキュメントを返しますが、ネストされた配列のロードとサイズを指定するフィールドを指定することによって、このドキュメントの内容を変更することができます。

1
追加された

現在のバージョンのMongoDBではこれを行うことはできません。あなたは、それを2つのコレクションに分割して参照する必要があると言います。私はこれまで、埋め込み配列の他の制限のためにこれを行う必要がありました。例えば、それらをクエリでソートできないなどです。

0
追加された