如何在MongoDB聚合中添加自动递增字段?

ckocjqey  于 2023-10-16  发布在  Go
关注(0)|答案(3)|浏览(125)

我想添加一个额外的关键数字,其中包含自动递增数字的值。我如何才能做到这一点?下面是查询。有没有可能在不进行放松和分组的情况下实现这个结果?

[
   {
      "$match":{
         "iContestId":"5e4118161a7b5765ee9b40ef"
      }
   },
   {
      "$project":{
         "_id":"$_id",
         "nPointsEarned":"$nPointsEarned",
         "iContestId":"$iContestId",
         "iUserId":"$iUserId",
         "ranking":"$ranking",
         "sFullName":"$sFullName",
         "sProfilePicture":"$sImage",
         "nAutoIncrement": {
             "$count": {
                 "$sum": 1
             }
         }
      }
   },
   {
      "$sort":{
         "ranking":1
      }
   },
   {
      "$skip":0
   },
   {
      "$limit":23
   }
]
j2cgzkjk

j2cgzkjk1#

这不可能。没有任何运算符来生成序列号

n3schb8v

n3schb8v2#

实际上,您现在可以在聚合管道中使用$setWindowFields操作(Mongo 5中的新操作)来实现这一点。
例如:

Model
  .aggregate([
    { $match: queryFilter },
    {
      $setWindowFields: {
        sortBy: sortFilter,
        output: {
          yourIndexFieldName: {
            $count: {},
            window: { documents: ['unbounded', 'current'] },
          },
        },
      },
    },

将在yourIndexFieldName字段中存储来自查询的每个文档(自动递增)索引。
这是因为这将返回与queryFilter指定的过滤器相匹配的文档的计数,相对于文档在文档窗口中的位置。
因此,如果操作正在查看窗口中的文档4,则文档窗口中到该点的计数将为4。
注意:由于$count的性质,索引将从1而不是0开始

js5cn81o

js5cn81o3#

您可以使用$addFields$add的组合(v5及更高版本中支持)来实现这一点。

Model.updateMany({ iContestId: '5e4118161a7b5765ee9b40ef' }, [
  {
    $addFields: {
      nAutoIncrement: { $add: ['$nAutoIncrement', 1] },
    },
  }
]);

如果nAutoIncrement是集合中的现有字段,则它将获得1。如果不是,我认为这将添加该字段到文档中(不要引用我的话)。
查看Updates with Aggregation Pipeline上的mongodb文档。

相关问题