0

mongoDB には非常に複雑なデータ構造があります。ドキュメントはこのように少し見えます

{ 
    "id" : 0, 
    "basket" : [
        {
            "price" : 0.9918, 
            "id" : 2500, 
            "exGroup" : [
                {
                    "exgId"  : 0, 
                    "ePrice" : 0.9918
                }
                {
                    "exgId"  : 1, 
                    "ePrice" : 0.9918
                }
            ]
        }, ]}

ドキュメントの配列を埋め込みドキュメントの exGroup 配列に追加して、各埋め込みドキュメントが次のようになるようにしたいと思います

                {
                     "id"  : 0, 
                     "price" : 0.9918
                     "order"  : {
                          "id":0,
                          "exec":
                              [{
                                "quantity" : 1,
                                "price"    : 1.0
                                },
                                {
                                "quantity" : 1,
                                "price"    : 1.01
                                }
                              ]
                 }

次のような更新クエリでこれを実行しようとしました。

db.fund.update(
    {
        "id": 0,
        "basket.id": 2500,
        "basket.exGroup.exgId": 0,
        "basket.exGroup.order": {"$exists" : false}
    },
    {
        "$set":
        {
            "basket.exGroup.$.order" : 
             {
               "id":0,
               "exec":
                  [{
                    "quantity":1,
                    "price":0.9978
                  }]
             }
        }
    }
)

残念ながら、これによりエラー "fundId": 0, "date": ISODate("2016-11-21T11:00:00.000+0000"), "basket.assetId": 2500, "basket.exGroup.exgId": 0 が表示されます

基本的に私の問題は、マルチレベル配列 (つまり、doc.array.doc.array.doc) のリーフにあるドキュメントを正しくアドレス指定する方法がわからないことです。

4

1 に答える 1

0
db.rich.update(
    {
        "id": 0,
        "basket.id": 2500,
        "basket.exGroup.exgId": 0,
        "basket.exGroup.order": {"$exists" : false}
    },
    {
        "$push":
        {
            "basket.$.exGroup" : 
             {
               "id":0,
               "exec":
                  [{
                    "quantity":1,
                    "price":0.9978
                  }]
             }
        }
    }
)

これにより、基本的に exGroup が更新され、新しいドキュメントがプッシュされます。ただし、それに応じてドキュメントをモデル化する必要があります。

于 2016-11-21T16:18:14.700 に答える