问题描述
我有以下问题:
我想跟踪博客帖子的访问,因此我想到了创建一个名为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()方法。