0

MongoDB を使用して C# コードで更新する必要があります。ここでは、以下の更新の第 2 レベルの配列を実装しました (subBranchindex は一般的なリスト オブジェクトで取得されます):-

for (var index = 0; index < subBranchindex.Count; index++)
{
    if (subBranchindex[index]._id == new ObjectId(subBranchid))
    {
        IMongoQuery queryEdit = Query.EQ("BranchOffice.SubBranchlist._id", new ObjectId(subBranchid));
        UpdateBuilder update = Update.Set("BranchOffice.$.SubBranchlist."+ index +".Name",subBranch.SubName).
        SafeModeResult s = dc.Collection.Update(queryEdit, update, 
        UpdateFlags.None, SafeMode.True);
    }
}

ここでは、第 2 レベルの配列で、(for loop ステートメント) を使用して、配列のインデックス値を取得していました。次に、配列の 3 番目、4 番目、5 番目のレベルを使用できます。これは、(for ループ ステートメント) 以上が割り当てられることを意味します。したがって、[for loop ステートメント] は必要ありません。また、インデックスにハードコア番号を割り当てる必要もありません。 For example: ("BranchOffice.$.SubBranchlist.0.Name",subBranch.SubName). ここではハードコアな数値 [インデックス] 0 または 1 または 2 を使用しないでください。「第 2」レベルの配列には 100 を超えるレコードがあります。

インデックス値を配列するために使用できる方法はありますか? この問題を解決する方法を説明してください。例を挙げて説明してください。

4

1 に答える 1

0

上記の例に基づいて、スキーマについての私の理解は次のとおりです。

  • トップレベルのドキュメントにはBranchOfficeフィールドがあります
  • BranchOfficeオブジェクトの配列です
  • 内の各オブジェクトにBranchOffice_id, SubNameandSubBranchlistフィールドがあります
  • SubBranchlistオブジェクトの配列です
  • 内部の各オブジェクトにSubBranchlistNameフィールドがあります

update ステートメントは、(の兄弟フィールド)内のオブジェクト間のSubName各フィールドにフィールドをコピーしているようです。NameSubBranchlistSubName

プロパティ パス構文を使用して配列を介してフィールドを選択する場合 (例: )、配列内のすべてのオブジェクト間でフィールドSubBranchlist.0.Nameを変更できる「ワイルドカード」インデックスはありません。Name

多少関連する注意として、$ 位置演算子は最初に一致した配列要素にのみ適用されるため、それを使用して複数の配列要素を更新することはできません。あなたの場合、BranchOffice配列フィールドに位置演算子を使用しているため、とにかくオプションではありません。

一連の更新クエリを ( の各要素に対してSubBranchlist) 発行するか、または を使用して 1 つのクエリで配列$set全体を変更することを検討できます。SubBranchlistusing の欠点$setは、配列全体を読み書きする必要があることです。これは、他の同時操作が配列に更新を発行している場合に問題になる可能性があります。

于 2012-10-12T17:04:13.900 に答える