javascript - 在猫鼬中实现大小为 N 的队列
问题描述
所以我有一个聊天模型,我想在消息中只保留 100 条消息:[] 以节省内存。我关注了一些论坛,但我在不完全符合我查询的最新文章中发现了Capped Collection 。
我可以在操作中使用$each、$pop 操作或arr.100 $exists,但需要添加查询(用于计数消息,然后在长度 > N 时弹出)。可以在 1 个查询中添加新消息,如果长度 > N 则弹出?
是否有任何简短的查询或队列实现?
这是模型:
messageOb = mongoose.Schema({
_id: false,
sender: String,
text: String,
time: Number,
seen: Boolean
}, {versionKey: false});
const chatSchema = mongoose.Schema({
_id: {type: mongoose.Types.ObjectId, require: true},
messages: [messageOb], // max size of array will be 100
createdOn: Number // new Date().getTime()
});
解决方案
在 MongoDB 4.2+ 中,您可以使用$slice和$concatArrays聚合运算符。
db.chats.update(
{filter criteria},
[{$set:{
messages:{
$slice:[
{$concatArrays:["$messages",[{new message object}]]},
-100
]
}
}}]
)
推荐阅读
- python - 训练和验证示例不显示为模型的返回
- javascript - 使用 JavaScript 进行麦克风输入
- webpack - webpack文件夹中的感叹号
- windows - 当我编译有错误的程序时,我的自定义命令窗口背景颜色会发生变化
- python - 如何使用 PyTest 和 Selenium 维护用户池?
- velocity - 使用 Telosys 生成单个文件
- reactjs - Firebase 读取的增加反应
- function - 在 Google Apps 脚本中的同一脚本中调用另一个函数中的函数
- r - ggplot2 和 sf:coord_fixed() 不能与 geom_sf() 和 coord_sf() 结合使用
- java - 原因:java.lang.IllegalArgumentException:查询方法公共抽象 java.lang.Integer com.dyplom.repository 的验证失败