13

私はMongoにこのデータを持っています:

{
    "_id" : ObjectId("505fd43fdbed3dd93f0ae088"),
    "categoryName" : "Cat 1",
    "services" : [
        {
            "serviceName" : "Svc 1",
            "input" : [
                { "quantity" : 10, "note" : "quantity = 10" }, 
                { "quantity" : 20, "note" : "quantity = 20" }
            ]
        },
        {
            "serviceName" : "Svc 2",
            "input" : [
                { "quantity" : 30, "note" : "quantity = 30" }, 
                { "quantity" : 40, "note" : "quantity = 40" }
            ]
        }
    ]
}

ここで、「Svc 1」の数量を更新します。

{ "quantity" : 10, "note" : "quantity = 10" }

お気に入り:

{"quantity": 100, "note": "changed to 100"}

モンゴはどうすればいいの?

私が知っているように、操作演算子は最初の配列のみをサポートします。誰かがサブサブ配列の要素のインデックスを使用するようにアドバイスしましたが、問題は実行時にそのインデックスをどのように知ることができるかということです? (MongoDB のネイティブ C# ドライバーを使用しています)

ご協力いただきありがとうございます。

ジョニー

4

2 に答える 2

13

配列内に配列があるため、更新する配列内の位置がわからない限り、ネストされたサブ配列を参照する簡単な方法はありません。

したがって、たとえば、「Svc 1」の最初の入力を次の C# に相当するもので更新できます。

db.services.update(

    // Criteria
    {
        '_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
        'services.serviceName' : 'Svc 1'
    },

    // Updates
    {
        $set : {
            'services.$.input.0.quantity' : 100,
            'services.$.input.0.note' : 'Quantity updated to 100'
        }
    }
)

入れ子になった配列の位置がわからない場合はinput、一致する をフェッチし、アプリケーション コードで配列をservices反復処理してから、更新された配列を反復処理する必要があります。input$set

または、ネストされた配列を変更して、代わりに埋め込みドキュメントを使用することもできます。

{
    "categoryName" : "Cat 1",
    "services" : [
        {
            "serviceName" : "Svc 1",
            "input1" : { "quantity" : 10, "note" : "quantity = 10" }, 
            "input2" : { "quantity" : 20, "note" : "quantity = 20" }
        },
    ]
}

次に、名前で更新できます。たとえば、次のようになりますinput1

db.services.update(

    // Criteria
    {
        '_id' : ObjectId("5063e80a275c457549de2362"),
        'services.serviceName' : 'Svc 1'
    },

    // Updates
    {
        $set : {
            'services.$.input1.quantity' : 100,
            'services.$.input1.note' : 'Quantity updated to 100'
        }
    }
)
于 2012-09-27T05:39:43.910 に答える
8

更新したい値の位置がわからないので、最初に更新された情報を含む新しい値を挿入してから、更新したい値を削除します。

db.services.update(
   {
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
    'services.serviceName' : 'Svc 1'
   },
   {
    { $addToSet: { 'services.$.input' : "new sub-Doc" }
   }
)

そして、挿入が成功したら削除します

db.services.update(
   {
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"),
    'services.serviceName' : 'Svc 1'
   },
   {
    { $pull: { 'services.$.input' : { "quantity" : 10, "note" : "quantity = 10" } }
   }
)

これは、インデックスが不明で、ドキュメントに「input」のような同じキーを持つサブドキュメントが必要な場合に役立ちます

于 2014-04-07T06:54:01.237 に答える