![](/img/trans.png)
[英]Recursively add property to every node in a tree-like structure and return modified tree
[英]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.