所以有陣列 coursesFollowing 和里面的物件,例如:
objInside = {
username:"SweetWhite"
courseTitle:"TOMATOaaaaa"
progress:0
}
我有一個函式可以在這種物件的物件陣列中找到正確的物件索引,它似乎在找到的索引和物件方面起作用,但是當我執行它時,我的更新請求很奇怪:
User.updateOne({username: req.body.username}, {coursesFollowing:{$slice: [removeIndex , 1]}}, function(err,result){
if(err){return next(err)}
})
它找到了正確的用戶放入它,也找到了正確的欄位,但是它不會洗掉該removeIndex索引中的物件,而是洗掉陣列中的所有專案并只放入一個物件,陣列名為 $sliceremoveIndex由于第一個值和第二個值是1,從資料來看它并沒有洗掉所有其他物件,而是簡單地將它們替換為自己,操作 $slice 將自己推入陣列并沒有執行我認為?我有點困惑。
無論如何,我該如何解決這個問題?如何在不推送奇怪的 $slice 物件陣列的情況下洗掉陣列的索引?
謝謝!
uj5u.com熱心網友回復:
如果您注意到更新的檔案,您可能會意識到您實際上并未使用$slice運算子更新陣列中的任何內容。相反,您正在為陣列設定一個新值。這就是為什么您將第一個元素視為$slice某物而將第二個元素視為1.
$slice運算子與$push最后一起使用,用于限制陣列欄位中的元素個數。給定它的索引,該檔案沒有提到使用它洗掉陣列元素。
根據這個答案,沒有簡單的方法可以做到這一點。
有$pull,但它不適用于給定的索引。它基于陣列中物件的查詢條件作業。因此,如果您首先找出元素索引,然后在更新查詢中使用它。你可以直接這樣做。
如果你想使用一個 JS 函式,你可以使用splice,它會進行就地更新。使用$function
User.updateOne({username: req.body.username}, [{ $set:
{ "coursesFollowing": { $function: { body: function(coursesFollowing) { coursesFollowing.splice(removeIndex, 1); return coursesFollowing; }, args: ["$coursesFollowing"], lang: "js" }} }
}], function(err,result){
if(err){return next(err)}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/438878.html
