【问题标题】:Applying FIFO document per user in mongodb在 mongodb 中为每个用户应用 FIFO 文档
【发布时间】:2020-10-21 03:30:42
【问题描述】:

我有以下示例文档的 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'
}

但应用先进先出,即我想将每个用户的文档数限制为 5,在这种情况下,我想先删除以下文档,假设先插入它

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

然后插入文档,即


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

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

【问题讨论】:

  • 除了 Holy_diver 的建议之外,您还可以使用有上限的集合。
  • @D.SM,上限集合限制了集合中的文档总数。因此不适合这个用例
  • 问题请求将文档 # 限制为 5,不是吗?
  • 每个用户的文档,而不是文档总数

标签: mongodb mongoose mongodb-query mongoose-schema


【解决方案1】:

您可以将架构反规范化为:

 {
       "_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
       }
     }
   }
)

【讨论】:

  • 设计有限制,不能去规范化
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2020-11-19
  • 2017-07-25
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多