簡體   English   中英

我無法在ArangoDB的FOR循環中多次更新同一文檔

[英]I can not update same document multiple times in FOR loop in ArangoDB

我有一個集合或用戶,我需要循環更新兩次屬性“ cuantity”。 例如,在更新數組中,我需要將其增加1,然后將其增加2,因此,如果實際值為1,則結果值必須為4,但這種方式不會發生。 ArangoDB接縫以獲取update數組循環中的最后一個更新對象並關閉循環中的先前更新對象。

這是我的收藏(用於簡化測試):

{"_key": "1", "name":"ivan", "cuantity":1}
{"_key": "2", "name":"juan", "cuantity":1}
{"_key": "3", "name":"carl", "cuantity":1}

這是我的查詢和更新數組

let updateData = [
  { user_key: "1", cuantity: 1},
  { user_key: "1", cuantity: 2},
  { user_key: "2", cuantity: 1},
  { user_key: "2", cuantity: 3}
  ]

FOR e IN updateData
  LET doc = DOCUMENT(CONCAT("test1/",e.user_key))
  UPDATE doc WITH { cuantity: doc.cuantity + e.cuantity }
  IN test1
  LET updated = NEW
RETURN updated

這是結果

[
  {
    "_key": "1", "_id": "test1/1",
    "name": "ivan",
    "cuantity": 2
  },
  {
    "_key": "1", "_id": "test1/1",
    "name": "ivan",
    "cuantity": 3
  },
  {
    "_key": "2", "_id": "test1/2",
    "name": "sergio",
    "cuantity": 2
  },
  {
    "_key": "2", "_id": "test1/2",
    "name": "sergio",
    "cuantity": 4
  }
]

該操作的結果必須是“ _key”:“ 1”的用戶具有“ cuantity”:4,因為在第一次迭代中它增加了1,在第二次迭代中增加了2。問題似乎是ArangoDB無法在同一循環中基於先前的更新來更新文檔。 有一個可實現此目的的工作配置? 我正在使用RocksDB引擎。

Arango 3.4似乎總是在循環執行更新時更新原始值。 我只是直接在webGUI中在我的機器上運行了它:

let myData = [
{ user_key: "1", cuantity: 1},
{ user_key: "1", cuantity: 2},
{ user_key: "2", cuantity: 1},
{ user_key: "2", cuantity: 3},
{ user_key: "3", cuantity: 2}
]

For entry in myData
  LET doc = DOCUMENT(CONCAT("test4/",entry.user_key))
  UPDATE doc WITH { cuantity: doc.cuantity + entry.cuantity }
  IN test4
  LET updated = NEW
RETURN updated

假設在更新之前user_key的要求為1,我最終在更新結束時得到的錯誤值為3而不是4。

話雖如此,我認為您可能希望在進行更新之前匯總數據。 例如,如果在批處理中將user_key = 1的值更新了100次,則您可能不想運行更新100次,因為這可能會導致性能問題。 如果進行預匯總,則只需在末尾更新一次記錄即可。 因此,例如,您可以執行以下操作:

let myData = [
{ user_key: "1", cuantity: 1},
{ user_key: "1", cuantity: 2},
{ user_key: "2", cuantity: 1},
{ user_key: "2", cuantity: 3},
{ user_key: "3", cuantity: 2}
]


 LET aggData = ( FOR entry IN myData
  COLLECT theKey = entry.user_key 
  AGGREGATE addedCuantity = sum(entry.cuantity)
  RETURN {theKey, addedCuantity}
  )

  FOR aggEntry IN aggData
  LET doc = DOCUMENT(CONCAT("test4/",aggEntry.theKey))
  UPDATE doc WITH { cuantity: doc.cuantity + aggEntry.addedCuantity }
  IN test4
  LET updated = NEW
  RETURN updated

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM