簡體   English   中英

貓鼬:遞歸迭代以更新樹狀結構中的屬性

[英]Mongoose: Recursively iterate to update property in tree-like structure

我已經實現了用於存儲評論的“樹狀”結構。 基本上,每個“注釋”都是一個節點,其中包含一個鏈接到另一個“注釋”節點的“父”屬性。 我還在每個節點上存儲一個“ replyCount”字段,該字段跟蹤作為特定特定“ comment”節點的“ reply”而鏈接到該節點的節點數。

為了在將新注釋添加到數據庫后更新回復計數,我正在這樣做。

    var done = false;
    while (!done) {
        console.log('Parent: ', parent);            
        Comments.findByIdAndUpdate(
                    parent,
                    {
                        $inc: {
                                replyCount: 1
                        }
                    },
                    (err, res) => {
                        if (err) done = true;       
                        console.log(res);
                        parent = res.parent;
                    });
    }

我這樣做的邏輯是,找到當前節點的父節點(我們稱其為ParentNode),更新其計數,將ParentNode的父節點設置為新的父節點,並繼續直到遇到錯誤(到達樹根時會發生這種情況) ),在這種情況下,我將“ done”變量設置為true並退出while循環。

但是,由於在下一次while循環迭代之前未調用回調函數,因此此實現始終陷入無限循環。

我想到的另一種策略是,填充一個我需要更新其計數的“父代ID”列表。 為了做到這一點,我仍然需要遍歷我的樹結構以獲得我需要的ID的列表。 有沒有更簡單的方法可以使用貓鼬遍歷結構?

編輯-這是我要完成的目標的直觀表示。

注釋樹結構

當新的注釋對象插入數據庫時​​,我想相應地增加replyCount的值。

由於調用MongoDB的異步特性,while循環會給您帶來很多麻煩。 但是,設置一個遞歸函數,看看它是否更好。 如果您開始使用深入多個級別的樹,則可能會遇到速度問題,但是通過這種方式,您將不會在第一個函數完成之前再次調用該函數。

function updateParent(parent) {
    // stop the recursion once the parent is root
    if (parent === 'root') return
    Comments.findByIdAndUpdate(
                parent,
                {
                    $inc: {
                            replyCount: 1
                    }
                },
                (err, res) => {
                    if (err) return;       
                    console.log(res);
                    // call the function recursively with the new parent
                    updateParent(res.parent);
                });
}

您還可以查看aggregate函數是否可以幫助您計算答復數,因為您已經鏈接了數據。

暫無
暫無

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

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