我正在撰寫一個應用程式,在代碼的一部分中,我需要從陣列中洗掉一定數量的元素,但我對 MongoDB/Mongoose 沒有太多經驗。
例如,我的查詢需要洗掉n陣列的第一個元素:
let array = ["a", "b", "c", "d", "e"];
if (n < array.length) {
array = array.slice(n); // Delete the first n values
}
我可以回圈我的代碼,但它會做很多查詢,一一洗掉,這對性能不利。我的另一種選擇是查詢陣列元素,在代碼中切片,并使用另一個查詢更新資料庫陣列。這也是一個不錯的選擇,但我更喜歡在這里問,因為也許有一種方法可以只用一個查詢來完成。
我知道在 MongoDB 中有一種方法可以洗掉第一個/最后一個元素,但我沒有發現任何關于洗掉多個元素的資訊。
Model.updateOne(filter, { $pop: { list: -1 } });
uj5u.com熱心網友回復:
嘿,您可以在查詢時查看$slice 運算子。也就是說,如果您要從陣列的末尾洗掉多個元素或從陣列的開頭洗掉多個元素,它的效果很好。但是,如果您要從陣列的中間洗掉,則可能更容易先找到檔案,.slice()在 JavaScript 中應用標準操作,然后通過呼叫.save()檔案上的方法將檔案與新陣列一起保存。
作為$slice運算子的示例:
const document = { "_id" : 3, "scores" : [ 89, 70, 100, 20 ] }
db.students.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ ],
$slice: -2
}
}
}
)
/*
Our result is the last two elements, and we removed the first two.
*/
const result = { "_id" : 3, "scores" : [ 100, 20 ] }
或者你可以像下面這樣:
db.students.update({_id: 3}, [
{$set: {scores: {
$slice: ["$field", {$add: [1, P]}, {$size: "$field"}]
}}}
]);
其中 P 是要停止在陣列中洗掉的元素的索引,將 P 留給結束元素。(意味著 P 之前的所有元素都被洗掉)
或這個:
db.students.update({_id: 3}, [
{$set: {scores: {
$slice: ["$field", P]
}}}
]);
其中 P 是您要停止從陣列末尾洗掉的元素的索引,從而為您留下 P 元素的開始。(意味著 P 之后的所有元素都被洗掉)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465389.html
上一篇:訪問架構默認值
