簡體   English   中英

Arangodb從文檔中刪除子項目

[英]Arangodb removing subitems from document

如何從文檔中刪除子項目。 假設我有一個名為sales的文檔,每筆交易都有一個sales.item,其中包含{name,price,code}。

我想通過檢查代碼是否為空或null來刪除無效的每個項目。

嘗試以下類似操作失敗並顯示錯誤,不確定我是否需要使用子查詢以及如何使用。

FOR sale in sales
FOR item in sale.items
    FILTER item.code == ""
REMOVE item IN sale.items

另一嘗試

FOR sale in sales
    LET invalid = (
        FOR item in sale.items
            FILTER item.code == ""
        RETURN item
    )

REMOVE invalid IN sale.items LET removed = OLD RETURN removed

以下查詢將為sales每個文檔重建項目。 它將僅保留其代碼不為null且不為空字符串的項目:

FOR doc IN sales 
  LET newItems = (
    FOR item IN doc.items 
      FILTER item.code != null && item.code != '' 
      RETURN item
    ) 
  UPDATE doc WITH { items: newItems } IN sales

這是我使用的測試數據:

db.sales.insert({ 
  items: [ 
    { code: null, what: "delete-me" }, 
    { code: "", what: "delete-me-too" }, 
    { code: "123", what: "better-keep-me" }, 
    { code: true, what: "keep-me-too" }
  ]
});
db.sales.insert({ 
  items: [ 
    { code: "", what: "i-will-vanish" },
    { code: null, what: "i-will-go-away" },
    { code: "abc", what: "not me!" }
  ]
});
db.sales.insert({ 
  items: [ 
    { code: "444", what: "i-will-remain" },
    { code: null, what: "i-will-not" }
  ]
});

沒有子查詢,這是一種更好的方法。 相反,將使用刪除數組元素的函數:

FOR doc IN sales
    FOR item IN doc.items 
        FILTER item.code == ""
            UPDATE doc WITH { items: REMOVE_VALUE( doc.items, item ) } IN sales

REMOVE_VALUE將一個數組作為第一個參數,並將該數組內的一個數組項作為第二個參數,並返回一個數組,該數組具有第一個參數的所有項,但第二個參數中沒有該特定項。

例:

REMOVE_VALUE([1, 2, 3], 3) = [1, 2]

子文檔為值的示例:

REMOVE_VALUE( [ {name: cake}, {name: pie, taste: delicious}, {name: cheese} ] , {name: cheese}) = [ {name: cake}, {name: pie, taste: delicious} ]

您不能僅單獨使用REMOVE_VALUE,就不能單獨使用REMOVE命令。 您必須將它用作UPDATE命令的一部分,而不是REMOVE命令的一部分。 不幸的是,它的工作方式是在您當前正在處理的一個特定“文檔”中復制“項目”列表,但是該副本包含您不喜歡的子文檔,已從“項目”列表中刪除。 列表的新副本替換了項目列表的舊副本。

還有另一種最有效的從列表中刪除子文檔的方法-即通過使用items [2]訪問列表的特定單元格-而且您必須使用比我在此使用的奇特的花式數組函數。在列表中查找特定的單元格(是[2]還是[3]或[567]),然后使用UPDATE命令用Null替換該單元格的內容,然后將選項設置為KeepNull = false 。 那是“最有效”的方法,但是看起來很復雜。):我可能稍后再寫該查詢,然后放在這里,但是現在..老實說,我建議使用上面描述的方法,除非您有每個列表中有一千個子文檔。

暫無
暫無

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

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