Mongodb Mongoose:如何从数组中自动删除旧条目?

Mongodb Mongoose:如何从数组中自动删除旧条目?,mongodb,mongoose,Mongodb,Mongoose,我有一个消息应用程序,可以显示消息线程。为了避免分页、没完没了的api调用和性能问题,我想自动删除数组中早于x天的消息,以便保留少量数据 怎么做?如果不可能,在尝试推送新消息时,如果数组中已经有50个元素,如何自动从数组中删除最旧的元素?我可以用本机javascript实现,但也许有更干净的方法 const mongoose=require(“mongoose”); const conversationSchema=newmongoose.Schema( { 名称:{type:String,必

我有一个消息应用程序,可以显示消息线程。为了避免分页、没完没了的api调用和性能问题,我想自动删除数组中早于x天的消息,以便保留少量数据

怎么做?如果不可能,在尝试推送新消息时,如果数组中已经有50个元素,如何自动从数组中删除最旧的元素?我可以用本机javascript实现,但也许有更干净的方法

const mongoose=require(“mongoose”);
const conversationSchema=newmongoose.Schema(
{
名称:{type:String,必需:true,unique:true},
消息:[{message:{type:String},authorId:{type:String}],
最后信息:{
authorId:{type:String},
代码段:{type:String},
读取:{type:Boolean},
},
},
{时间戳:true}
);
索引({name:1});
module.exports=mongoose.model(“对话”,会话模式)
操作员允许
$push
对数组进行压缩,然后限制该数组的长度:

db.messageChannels.update(
   { _id: myMessageChannelId },
   {
     $push: {
       messages: {
         $each: [ "Hello world!" ],
         $slice: -50
       }
     }
   }
)


类似地,在更新时,您可以使用删除任何符合条件的邮件(在本例中,条件将早于X天)。如果没有人使用该频道,这些消息不会自动过期(如果使用TTL索引跟踪整个频道上的
lastMessageDate
,则可以通过删除整个频道来自动处理)

要使全部过期,可以在cron上运行如下查询:

db.messageChannels.update(
    { },
    { $pull: { messages: { sentAt: {$lte: expirationDate} } },
    { multi: true }
)
TTL索引适用于整个文档,因此不可行,除非您按
日期
或类似方式对邮件进行分组

db.messageChannels.update(
    { },
    { $pull: { messages: { sentAt: {$lte: expirationDate} } },
    { multi: true }
)