2015-05-27 1 views
5

У меня есть объект, хранящийся в arangodb, который имеет дополнительные внутренние объекты, мой текущий прецедент требует, чтобы я обновил только один из элементов.Обновление внутреннего объекта в arangodb

магазин Объект

{ 
    "status": "Active", 
    "physicalCode": "99999", 
    "postalCode": "999999", 
    "tradingCurrency": "USD", 
    "taxRate": "14", 
    "priceVatInclusive": "No", 
    "type": "eCommerce", 
    "name": "John and Sons inc", 
    "description": "John and Sons inc", 
    "createdDate": "2015-05-25T11:04:14+0200", 
    "modifiedDate": "2015-05-25T11:04:14+0200", 
    "physicalAddress": "Corner moon and space 9 station", 
    "postalAddress": "PO Box 44757553", 
    "physicalCountry": "Mars Sector 9", 
    "postalCountry": "Mars Sector 9", 
    "createdBy": "john.doe", 
    "modifiedBy": "john.doe", 
    "users": [ 
    { 
     "id": "577458630580", 
     "username": "john.doe" 
    } 
    ], 
    "products": [ 
    { 
     "sellingPrice": "95.00", 
     "inStock": "10", 
     "name": "School Shirt Green", 
     "code": "SKITO2939999995", 
     "warehouseId": "723468998682" 
    }, 
    { 
     "sellingPrice": "95.00", 
     "inStock": "5", 
     "name": "School Shirt Red", 
     "code": "SKITO245454949495", 
     "warehouseId": "723468998682" 
    }, 
    { 
     "sellingPrice": "95.00", 
     "inStock": "10", 
     "discount": "5%", 
     "name": "School Shirt Blue", 
     "code": "SKITO293949495", 
     "warehouseId": "723468998682" 
    } 
    ] 
} 

Я хочу изменить только один из продуктов стоимость акций

{ 
    "sellingPrice": "95.00", 
    "inStock": "10", 
    "discount": "5%", 
    "name": "School Shirt Blue", 
    "code": "SKITO293949495", 
    "warehouseId": "723468998682" 
} 

как обновление магазина продукции на складе меньше 1, где магазин ID = х, то этот эффект

FOR store IN stores 
    FILTER store._key == "837108415472" 
    FOR product IN store.products 
     FILTER product.code == "SKITO293949495" 
    UPDATE product WITH { inStock: (product.inStock - 1) } IN store.products 

Помимо ab возможно, имеет смысл хранить продукт в виде отдельного документа в коллекции store_products. Я считаю, что NOSQL - лучший способ уменьшить размер документа.

ответ

5

Найдено ответ

здесь arangodb-aql-update-single-object-in-embedded-array и там arangodb-aql-update-for-internal-field-of-object

Я же считаю, что лучше сохранить отдельные документы и довольно использование объединений при получении. Обновления легко

+0

Я думаю, что вы правы. Хранение продуктов отдельно от магазинов будет иметь смысл. Это позволит легко и эффективно обновлять отдельные продукты (и магазины). Если хранилище и все его продукты содержались в одном документе, как указано выше, весь объект хранилища должен быть сохранен для каждого обновления продукта, что будет очень неэффективным. Кроме того, имеет смысл хранить значение 'inStock' как число, а не использовать строки. То же самое касается цен. – stj