【问题标题】:MongoDB/Mongoose how to manage incrementation of some Number fieldsMongoDB/Mongoose 如何管理一些数字字段的增量
【发布时间】:2021-05-21 20:40:08
【问题描述】:

我目前正在开发一个 API,我需要用户至少有 4 个数字字段,这些字段会随着时间的推移而增加。有些可能是 15000/小时,有些是 500/小时,有些是负数,例如 -8000/小时。我应该如何使用 Mongoose 处理此类数据存储?这些用户模型字段应该具有什么样的属性?如果你能给我提供一个简单的 Mongoose 模型来存储这样的数据,我会很高兴。

我是否应该在后端添加一些东西来增加(或减少)这些用户字段?或者 MongoDB/Mongoose 有什么东西可以提供这个功能吗?另外,我应该如何在网页上显示这些字段增加?我是否应该每隔几秒钟就获得增加的用户字段?还是应该只在前端使用 JavaScript?

提前致谢。

【问题讨论】:

    标签: node.js mongodb mongoose increment


    【解决方案1】:

    最终,这取决于您希望通过数据实现什么目标。 为了跟踪所有变化的日志,保留在其各自的数组中,那么bucket pattern将最好地解决您的问题[bucket pattern解释][1] [1]:https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern ,否则只需普通字段操作即可解决您的问题。

    [桶模式]和[字段操作]实现的架构设计如下所示:

    如果您打算跟踪所有更改的日志,那么 bucket 模式 是您的最佳选择,您的架构可能如下所示:

      const mongoose = require('mongoose')
      const { Schema } = mongoose
    
      const numberLogSchema1 = new Schema({
          field1: [
            {type:Number}
          ],
          field2: [
            {type:Number}
          ],
          field3: [
            {type:Number}
          ],
          field4: [
           {type:Number}
          ]
       })
    
       module.exports = mongoose.model('numberLogs1',numberLogSchema1)
    

    对应的应该是这样的:

       router.post('/numberLog', async (req, res) => {
          try {
              const saveNumberLog = await numberLog1.updateOne(
                { _id: numberCollectionIdhere },
                {
                    $push: {
                        field1: req.body.fieldLogValue
                }
            })
             res.json(saveNumberLog)
         }catch (err) {
             res.json({
                message: err
           })
         }
      })
    

    否则,如果您只想在前端的特定间隔内使用 javascript 计时器 操作字段值,该计时器也可以保存到数据库并在页面重新加载时获取,您的架构可能看起来像这样:

       const mongoose = require('mongoose')
       const { Schema } = mongoose
    
       const numberLogSchema2 = new Schema({
           field1: {
              type: Number,
              required: true,
              default: 0
           },
           field2: {
              type: Number,
              required: true,
              default: 0
           },
           field3: {
              type: Number,
              required: true,
              default: 0
           },
           field4: {
               type: Number,
               required: true,
               default: 0
           }
         })
    
      module.exports = mongoose.model('numberLogs2',numberLogSchema2)
    

    及其对应的路由路径,可能如下所示:

      //if you intend to just increase the logvalue hourly 
      //without keeping track of it previous value then we use $inc
      router.post('/numberLog2', async (req, res) => {
      try {
        const saveNumberLog2 = await numberLog2.updateOne(
            { _id: numberCollectionIdhere },
            {
                $inc: {
                    field1: req.body.fieldLogValue
                }
            })
            res.json(saveNumberLog2)
          }catch (err) {
             res.json({
               message: err
          })
        }
     }) 
    

    【讨论】:

    • 感谢您的回答。我喜欢两种方法来处理这个问题,但我认为第二种选择更适合我的系统。该数据模型是否可扩展?我的意思是当我有很多用户时,每个用户将至少有 4 个字段,并且每个字段都需要不断更新(或增加)。如果用户为 field1 增加了 15000/小时,那么这就是 4.17/sec,并且这个 field1 应该每秒增加 4.17。这健康吗?
    • 是的,mongodb 具有高度可扩展性,您可以查看mongodb.com/mongodb-scale 了解有关 mongodb 的更多信息
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多