首页 > 解决方案 > 在猫鼬中实现大小为 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() 
});

标签: javascriptnode.jsmongodbmongoose

解决方案


在 MongoDB 4.2+ 中,您可以使用$slice$concatArrays聚合运算符。

db.chats.update(
   {filter criteria},
   [{$set:{
      messages:{
        $slice:[
           {$concatArrays:["$messages",[{new message object}]]}, 
           -100
        ]
      }
   }}]
)

推荐阅读