2015-05-27 45 views
5

Mam obiekt przechowywany w arangodb, który ma dodatkowe obiekty wewnętrzne, mój aktualny przypadek użycia wymaga aktualizacji jednego z elementów.Zaktualizuj obiekt wewnętrzny w arangodb

Store Object

{ 
    "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" 
    } 
    ] 
} 

chcę zmienić tylko jeden z produktów, wartość zapasów

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

Podoba sklep aktualizacja Stock mniej 1, gdzie sklep id = x, coś w tej sprawie

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 

Oprócz ab może mieć sens przechowywanie produktu jako osobnego dokumentu w kolekcji store_products. Wierzę w NOSQL, że jest to najlepsze podejście do zmniejszania rozmiaru dokumentu.

Odpowiedz

5

Znaleziono odpowiedź

tutaj arangodb-aql-update-single-object-in-embedded-array i tam arangodb-aql-update-for-internal-field-of-object

Ja jednak uważam, że jest najlepszy do prowadzenia oddzielnych dokumentów i raczej stosowanie łączy przy pobieraniu. Aktualizacje z łatwością

+0

Myślę, że masz rację. Przechowywanie produktów oddzielnie od sklepów ma sens. Umożliwi to łatwe i wydajne aktualizowanie poszczególnych produktów (i sklepów). Jeśli sklep i wszystkie jego produkty były zawarte w jednym dokumencie, jak wyżej, cały obiekt sklepu musiałby zostać zapisany dla każdej aktualizacji produktu, co będzie bardzo nieefektywne. Poza tym sensowne może być przechowywanie wartości 'inStock' jako liczby zamiast używania łańcuchów. To samo dotyczy cen. – stj