根据数组长度增加计数器 updateMany() update()

问题描述

我有以下问题:

我想跟踪博客帖子的访问,因此我想到了创建一个名为visitorsIp的数组,并使用$addToSet将访问者的ip地址推入该数组的方法。

现在,我有一个cronjob,应根据数组的长度增加viewed计数器。并且应该在最后清除数组。

我的文档简化了:

{
   _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: []
}

viewed增加了3,因为数组大小为3。此后数组被清除。

解决方法

要更新

db.getCollection('test').update(
  {},[{
    $set: {
      "viewed": {$add: [ {$size:"$visitorsIp"},'$viewed' ]},"visitorsIp": []
      }
  }],{
    multi: true
  }
);

viewed不是有效的管道。

要向unset个visitsIp,您需要进行另一个查询才能将其设置为空或未设置visitorsIp。在单个查询中,两者不能在同一字段上引用。

,

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

updateMany()

  • $add,将现有总数+ $size中的visitorsIp总数加起来
  • visitorsIp设置为空[]
await Blog.updateMany({},[{
      $set: {
        "viewed": {
          $add:[{ $size:"$visitorsIp" },"$viewed"]
        },"visitorsIp": []
      }
  }]
)

update()

  • 需要为多个文档更新设置选项multi: true
await Blog.update({},{ multi: true }
)

注意:使用updateMany()而不是update(),因为在猫鼬中不建议使用update()方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...