Javascript 根据阵列长度增加计数器

Javascript 根据阵列长度增加计数器,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有以下问题: 我想跟踪我博客帖子的访问量,因此我想创建一个名为visitorsIp的数组,并使用$addToSet将访问者的ip地址推送到数组中 现在我有了一个cronjob,它应该根据数组的长度增加已查看的计数器。最后应该清除数组 我的文件简化了: { _ip: 5aösldkf3sdlfk2, viewed: 0, visitorsIp: ["192.168.200.20", "192.168.200.21", "192.

我有以下问题:

我想跟踪我博客帖子的访问量,因此我想创建一个名为
visitorsIp
的数组,并使用
$addToSet
将访问者的ip地址推送到数组中

现在我有了一个cronjob,它应该根据数组的长度增加
已查看的
计数器。最后应该清除数组

我的文件简化了:

{
   _ip: 5aösldkf3sdlfk2,
   viewed: 0,
   visitorsIp: ["192.168.200.20", "192.168.200.21", "192.168.200.22"]
}
我在这里试过这样的方法:

await Blog.aggregate([
    {
      $addFields: {
        counter: {
          $size: "$this.visitorsIp"
        }
      }
    },
    {
      viewed: {
        $add: ["$this.counter"]
      }
    }, 
    {
       visitorsIp: {
          $set: []
       }
    }
  ]);
})
{
   _ip: 5aösldkf3sdlfk2,
   viewed: 3,
   visitorsIp: []
}
似乎没有达到我的预期

我的预期结果如下:

await Blog.aggregate([
    {
      $addFields: {
        counter: {
          $size: "$this.visitorsIp"
        }
      }
    },
    {
      viewed: {
        $add: ["$this.counter"]
      }
    }, 
    {
       visitorsIp: {
          $set: []
       }
    }
  ]);
})
{
   _ip: 5aösldkf3sdlfk2,
   viewed: 3,
   visitorsIp: []
}
查看的
增加了3,因为数组大小为3。并在之后清除阵列。

以进行更新

db.getCollection('test').update(
  {},
  [{
    $set: {
      "viewed": {$add: [ {$size:"$visitorsIp"}, '$viewed' ]},
      "visitorsIp": []
      }
  }],
  {
    multi: true
  }
);
查看的
不是有效的管道

unset
visitorsIp,您需要另一个查询来设置为空或unset
visitorsIp
。在单个查询中,不能在同一字段上引用这两个字段。

要更新

db.getCollection('test').update(
  {},
  [{
    $set: {
      "viewed": {$add: [ {$size:"$visitorsIp"}, '$viewed' ]},
      "visitorsIp": []
      }
  }],
  {
    multi: true
  }
);
查看的
不是有效的管道


unset
visitorsIp,您需要另一个查询来设置为空或unset
visitorsIp
。在单个查询中,不能在同一字段上引用这两个字段。

您可以将
updateMany()
与管道一起使用

  • $add
    对现有计数+总计
    访问者SIP的
    $size
    求和
  • visitorsIp
    设置为空
    []
  • 需要为多个文档更新设置选项
    multi:true
注意:使用updateMany()而不是update(),因为在mongoose中update()方法已被弃用


您可以将
updateMany()
与管道一起使用

  • $add
    对现有计数+总计
    访问者SIP的
    $size
    求和
  • visitorsIp
    设置为空
    []
  • 需要为多个文档更新设置选项
    multi:true
注意:使用updateMany()而不是update(),因为在mongoose中update()方法已被弃用


你能添加你的预期结果吗?@turivishal肯定我添加了它。你能添加你的预期结果吗?@turivishal肯定我添加了它。对不起,我误读了你的问题,更新了答案。几乎成功了。问题是我想增加查看的
,而不是设置一个值
$inc
在聚合中不起作用?您的第二个解决方案完全删除了我的数组,而不是将其设置为
[]
这会导致
的错误参数$size必须是数组
是,这就是我需要帮助的地方at@Gibbs尼斯刚刚忘记添加
visitorsIp:[]
multi:true
,因为这将更新单个文档。对不起,我误读了你的问题,更新了答案。几乎有效。问题是我想增加查看的
,而不是设置一个值
$inc
在聚合中不起作用?您的第二个解决方案完全删除了我的数组,而不是将其设置为
[]
这会导致
的错误参数$size必须是数组
是,这就是我需要帮助的地方at@Gibbs尼斯刚刚忘记添加
visitorsIp:[]
multi:true
,因为这将更新单个文档。这实际上不起作用,因为您将
查看的
设置为数组大小,而不是递增
查看的
这实际上不起作用,因为您将
查看的
设置为数组大小,而不是递增
查看的