1

別のドキュメント内の埋め込み配列を更新するために使用しているクエリがあります。同じクエリに基づいてさまざまなアプローチを試みましたが、2 つの異なる結果が得られました

最初のアプローチ

collection.Update(mongoQuery, MongoDB.Driver.Builders.Update.SetWrapped("Expenses.$.Description", "some text")); 

ここでは、Expenses コレクションに埋め込まれたドキュメントの説明が期待どおりに更新されます。

C# API をもう少し読んで、一般的な Update を見つけて、これを試しました。

collection.Update(mongoQuery, Update<Expense>.Set(e => e.Description, "some text"));

同じ結果ではありません。埋め込まれたドキュメントを更新する代わりに、親ドキュメントは Description という名前の新しいプロパティを取得します。

最初のクエリでは、"Expenses" コレクションについてより明示的であることがわかります。2 番目のクエリでは、タイプ Expense を指定しているだけです。一般的な方法で同じ更新を行うことは可能ですか?

4

1 に答える 1

0

これはあなたが尋ねた最後の質問と少し似ていますが、LINQ でできることとできないことについて誤解があると思います。

2 行目には式が含まれていますUpdate<Expense>.Set(e => e.Description, "some text")$このステートメントは 100% コンテキストフリーで動作することを理解することが重要です。「埋め込みオブジェクト」で使用されているという事実、またはこの場合は位置演算子が存在する配列クエリで使用されているという事実についてまったく手がかりがありません。.

Update<T>.Set(e => e.Prop)type の何らかのクエリのコンテキストで呼び出されたことT2、 type Tinの唯一のプロパティT2が呼び出されExpensesたこと、およびこれが配列であり、配列式を使用して一致している必要があることを認識していることを期待します。ご覧のとおり$、出力に名前を挿入して置き換えるだけであっても、ドライバーはすべての魔法を実行するためにかなり多くのことを考慮する必要があります。

Expense親オブジェクトにExpensesAとの 2 つの配列があるとしますExpensesBExpensesAドライバーは、2 番目のクエリから、 ではなくを参照することをどのように知るのでしょうかExpensesB

原則として、コレクションのタイプが の場合、andTのみを使用する必要があります。MongoDB に特有の機能を使用する場合、多くの場合、文字列ベースのメソッドを使用する必要があります。Query<T>Update<T>db.Update<Event>(Query<Event>.EQ(p=>p.Id, 12), Update<Event>.Set(p => p.Details.Date, newDate))

于 2013-09-10T09:27:20.767 に答える