0

これが私の正確なスキーマです:

{
"_id" : ObjectId("4fb4fd04b748611ca8da0d45"),
"Name" : "Agent name",
"City" : "XXXX",
"BranchOffice" : [{

    "_id" : ObjectId("4fb4fd04b748611ca8da0d46"),
    "Name" : "Branch name",
    "City" : "XXXX",
    "SubBranch" : [{

        "_id" : ObjectId("4fb4fd04b748611ca8da0d47"),
        "Name" : "Sub-Branch Name",
        "City" : "XXXX"
        "Users" : [{

            "_id" : ObjectId("4fb4fd04b748611ca8da0d48"),
            "Name" : "User",
            "City" : "XXXX"
        }]
    }]
}]
}

そのc#で正常に挿入されました。挿入コードは以下のとおりですが、更新条件が失敗しました。

SubBranchとユーザーを使用してフィールド3レベルと4レベルの配列を更新したい

コードを挿入

IMongoQuery query = Query.And(Query.EQ("_id", new ObjectId(4fb4fd04b748611ca8da0d45)),

Query.EQ("BranchOffice._id", new ObjectId(4fb4fd04b748611ca8da0d46)));

Agent agent = dc.Collection.FindOne(query);

BsonDocument branchOffice = agent.BranchOffice.Find(objId => objId._id ==    new ObjectId(4fb4fd04b748611ca8da0d46)).ToBsonDocument();

subBranchListオブジェクトをBsonDocumentに変換しました

ファイル:name、city、_Id、およびアレイのユーザー

BsonDocument subBranchOffice = **subBranch.ToBsonDocument()**;

if (branchOffice.Contains("SubBranch"))
{
    if (branchOffice["SubBranch"].IsBsonNull)
    {
        branchOffice["SubBranch"] = new BsonArray().Add(BsonValue.Create(subBranchOffice));
    }
    else
    {                                     
        branchOffice["SubBranch"].AsBsonArray.Add(BsonValue.Create(subBranchOffice));
    }

    var update = Update.Set("BranchOffice.$.SubBranch",branchOffice["SubBranch"]); 
    SafeModeResult s = dc.Collection.Update(query, update, UpdateFlags.Upsert,SafeMode.True);
}

ここで、SafemodeResultはUpdateExisting=trueです。

ここに挿入されたオプションは正常です

次に、elseステートメントで更新しようとします。答えがわからない

コードを更新

else
{
    var queryEdit = Query.And(Query.EQ("_id", new ObjectId(4fb4fd04b748611ca8da0d45)), 

    Query.EQ("BranchOffice._id", new ObjectId(4fb4fd04b748611ca8da0d46)),
    Query.EQ("SubBranchlist._id", new ObjectId(4fb4fd04b748611ca8da0d47)));

    **//Index value 1 or 2 or 3**

    var update = Update.Set("BranchOffice.$.SubBranch."index value".Name", "sname").

    Set("BranchOffice.$.SubBranch."index value".city", "yyyyy" ?? string.Empty);
    SafeModeResult s = dc.Collection.Update(queryEdit, update, UpdateFlags.None,SafeMode.True);
}

ここで、SafemodeResultはUpdateExisting=Falseです。

ここで更新されたオプションは失敗です

このprobelmを解決する方法と、アレイのフィールド2および3レベルを更新する方法を説明してください

例を示してください

4

1 に答える 1

1

そこにはたくさんありますが、少なくとも問題の一部は、更新に使用しているデータとクエリの間で BranchOffice のスペルが異なっていること、また SubBranch の階層を見逃していることです。最後のコード サンプルはドキュメントと一致しません。この意志;

db.so.find({
    _id: ObjectId("4fb4fd04b748611ca8da0d45"),
    "BrancheOffice._id": ObjectId("4fb4fd04b748611ca8da0d46"),
    "BrancheOffice.SubBranch._id": ObjectId("4fb4fd04b748611ca8da0d47"),
}).toArray()
于 2012-10-04T14:39:32.530 に答える