在mongodb中为每个用户应用FIFO文档

在mongodb中为每个用户应用FIFO文档,mongodb,mongoose,mongodb-query,mongoose-schema,Mongodb,Mongoose,Mongodb Query,Mongoose Schema,我有mongodb集合和以下示例文档 [ { userId: 'Id1', activity: '1' }, { userId: 'Id1', activity: '2' }, { userId: 'Id1', activity: '3' }, { userId: 'Id1', activity: '4' }, { userId: 'Id1', activity: '5' }, { userId: 'Id2', activ

我有mongodb集合和以下示例文档

[
{
   userId: 'Id1',
   activity: '1'
},
{
   userId: 'Id1',
   activity: '2'
},
{
   userId: 'Id1',
   activity: '3'
},

{
   userId: 'Id1',
   activity: '4'
},
{
   userId: 'Id1',
   activity: '5'
},
{
   userId: 'Id2',
   activity: '7'
},
]
现在我想插入以下文档


{
   userId: 'Id1',
   activity: '6'
}
但是应用FIFO,即我想将每个用户的文档数限制为5,在这种情况下,我想先删除以下文档,假设它是先插入的

{
   userId: 'Id1',
   activity: '1'
}
然后插入文档,即


{
   userId: 'Id1',
   activity: '6'
}

如何使用mongodb或mongoose实现这一点?

您可以将模式反规范化为:

 {
       "_id":ObjectId("111342"),
       "userId": "abc",
       "activity_count":34,
       "last_5_activities":[
        {"type":"like","timestamp":12345555},
        {"type":"subscribe","timestamp":12375555}
       ]
    
    }
然后可以使用mongodb$push$slice更新活动

db.activities.update(
   { "userId": "abc" },
   {
     "$push": {
       "last_5_activities": {
         "$each": [ {"type":"comment","timestamp":1239554} ],
         "$slice": -5
       }
     }
   }
)

除了Holy_diver建议的之外,您还可以使用封顶集合。@D.SM,封顶集合限制集合中的文档总数。因此不适合此用例问题要求将文档限制为每个用户5个,没有文档,而不是全部文档设计中存在约束,即我无法将其反规范化