如何删除数组中除第一个索引之外的所有内容?

How to delete everything in an array except the first index?

我有一个collectionpeople。它有一个数组字段 numbers,其中每个文档在所述数组中都有不同数量的元素。

我的目标是保留第 0 个索引中的元素并递归删除其余元素。我该怎么做呢?

例如:

{_id: 1, numbers: [100, 200, 300]},       ->   {_id: 1, numbers: [100]},
{_id: 2, numbers: [101, 201]},            ->   {_id: 2, numbers: [101]}
{_id: 3, numbers: [102, 202, 400, 500]},  ->   {_id: 3, numbers: [102]},

您可以在更新管道中使用运算符 $first,如下所示:

 db.collection.update({},
 [
  {
   $addFields: {
     numbers: {
       $first: "$numbers"
       }
     }
  }
],
{
 multi: true
 })

解释:

将所有文档中的“numbers”数组替换为仅包含取自“numbers”的第一个元素的数组

Playground

如果您希望“数字”仍然是数组类型,您可以将 $first 的输出括在方括号 [] 中,如下所示:

     numbers: [{
       $first: "$numbers"
       }]

Playground 2

顺便说一句,$first 是 $arrayElemAt 的别名,您可以使用它从数组中提取其他元素 ...

但是当然可以通过@Clashsoft

之前提到的$slice来完成操作

@R2D2 的替代解决方案是使用 $slice。与 $first 不同,$slice 适用于多个元素。

collection.updateMany(
  {},
  { $push: { numbers: { $each: [], $slice: 1 } } }
);

您也可以使用 $slice: -1 从最后一个元素开始。

Mongo Playground 上看到这个。