mirror of https://gitee.com/bigwinds/arangodb
Add complex modification sample.
This commit is contained in:
parent
287a1978ec
commit
03d40f8f9e
|
@ -163,3 +163,97 @@ FOR u IN users
|
||||||
|
|
||||||
This will continue execution of the query even if errors occur during the
|
This will continue execution of the query even if errors occur during the
|
||||||
*REPLACE* operation. It works similar for *UPDATE*, *INSERT*, and *REMOVE*.
|
*REPLACE* operation. It works similar for *UPDATE*, *INSERT*, and *REMOVE*.
|
||||||
|
|
||||||
|
|
||||||
|
###Altering substructures
|
||||||
|
|
||||||
|
To modify lists in documents we have to work with temporary variables.
|
||||||
|
We will collect the sublist in there and alter it. We choose a simple
|
||||||
|
boolean filter condition to make the query better comprehensible.
|
||||||
|
|
||||||
|
First lets create a collection with a sample:
|
||||||
|
|
||||||
|
```js
|
||||||
|
database = db._create('complexCollection')
|
||||||
|
database.save({
|
||||||
|
"topLevelAttribute" : "a",
|
||||||
|
"subList" : [
|
||||||
|
{
|
||||||
|
"attributeToAlter" : "oldValue",
|
||||||
|
"filterByMe" : true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attributeToAlter" : "moreOldValues",
|
||||||
|
"filterByMe" : true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attributeToAlter" : "unchangedValue",
|
||||||
|
"filterByMe" : false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Heres the Query which keeps the *subList* on *alteredList* to update it later:
|
||||||
|
|
||||||
|
```js
|
||||||
|
FOR document in complexCollection
|
||||||
|
LET alteredList = (
|
||||||
|
FOR element IN document.subList
|
||||||
|
LET newItem = (! element.filterByMe ?
|
||||||
|
element :
|
||||||
|
MERGE(element, { attributeToAlter: "shiny New Value" }))
|
||||||
|
RETURN newItem)
|
||||||
|
UPDATE document WITH { subList: alteredList } IN complexCollection
|
||||||
|
```
|
||||||
|
|
||||||
|
While the query as it is is now functional:
|
||||||
|
|
||||||
|
```js
|
||||||
|
db.complexCollection.toArray()
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"_id" : "complexCollection/392671569467",
|
||||||
|
"_key" : "392671569467",
|
||||||
|
"_rev" : "392799430203",
|
||||||
|
"topLevelAttribute" : "a",
|
||||||
|
"subList" : [
|
||||||
|
{
|
||||||
|
"filterByMe" : true,
|
||||||
|
"attributeToAlter" : "shiny New Value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filterByMe" : true,
|
||||||
|
"attributeToAlter" : "shiny New Value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filterByMe" : false,
|
||||||
|
"attributeToAlter" : "unchangedValue"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
It will probably be soonish a performance bottleneck, since it **modifies**
|
||||||
|
all documents in the collection **regardless whether the values change or not**.
|
||||||
|
Therefore we want to only *UPDATE* the documents if we really change their value.
|
||||||
|
Hence we employ a second *FOR* to test whether *subList* will be altered or not:
|
||||||
|
|
||||||
|
```js
|
||||||
|
FOR document in complexCollection
|
||||||
|
LET willUpdateDocument = (
|
||||||
|
FOR element IN docToAlter.subList
|
||||||
|
FILTER element.filterByMe LIMIT 1 RETURN 1)
|
||||||
|
|
||||||
|
FILTER LENGTH(willUpdateDocument) > 0
|
||||||
|
|
||||||
|
LET alteredList = (
|
||||||
|
FOR element IN document.subList
|
||||||
|
LET newItem = (! element.filterByMe ?
|
||||||
|
element :
|
||||||
|
MERGE(element, { attributeToAlter: "shiny New Value" }))
|
||||||
|
RETURN newItem)
|
||||||
|
|
||||||
|
UPDATE document WITH { subList: alteredList } IN complexCollection
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue