是否可以删除数组中的第一个元素?

Is it possible to delete the firsts elements in an array?

我正在编写一个应用程序,在代码的一部分中我需要从数组中删除一定数量的元素,但我对 MongoDB/Mongoose 没有太多经验。

例如,我的查询需要删除数组的前 n 个元素:

let array = ["a", "b", "c", "d", "e"];

if (n < array.length) {
    array = array.slice(n); // Delete the first n values
}

我可以循环我的代码,但它会做很多查询,一个一个地删除,这对性能不利。我的另一种选择是查询数组元素,在代码中切片,然后用另一个查询更新数据库数组。这也是一个不错的选择,但我更愿意在这里问,因为也许有一种方法可以只用一个查询来完成。

我知道 MongoDB 中有一种方法可以只删除 first/last 元素,但我还没有找到任何关于删除多个元素的方法。

Model.updateOne(filter, { $pop: { list: -1 } });

你好,你查询的时候可以看看$sliceoperator。也就是说,如果您要从数组的末尾 中删除 多个元素,或者从数组的开头 中删除 多个元素,则效果很好。但是如果你从数组的中间移除,首先找到文档可能更容易,在 JavaScript 中应用标准的 .slice() 操作,然后用新数组保存文档,通过在文档上调用 .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之后的所有元素)