代码之家  ›  专栏  ›  技术社区  ›  user1578872

面向监控应用的Mongo数据建模

  •  4
  • user1578872  · 技术社区  · 6 年前

    用例:

    产品、公司

    公司是每种产品的消费者。每种产品将有1到10家公司在使用该产品。消费者数也会上下浮动。

    所以,每次运行时,我们都会得到相应公司的产品列表。产品细节如下:,

    产品:

    1. 产品名称
    2. 总数(这将给出当前可用的数字,并在每次投票时更改)
    3. 产品重量
    4. 公司列表-谁在使用此产品

    产品样本数据:

    {
                "productName" : "Small Box",
                "total" : NumberLong(1000),
                "weight" : "1.5",
                "durability" : "20",
                "companies" : [
                    {
                        "name" : "Nike",
                        "taken" : NumberLong(10)
                    },
                    {
                        "name" : "Reebok",
                        "taken" : NumberLong(20)
                    }
                ]
    }
    

    在这里,每次投票的投票数都会不断变化。

    Web应用程序:

    将有3个屏幕显示详细信息。

    1. 仪表板-这将显示高水平的统计数据,如(没有产品,没有公司,总规模,…)
    2. 产品-列表视图(查看完整列表)-将在选择任何产品时显示产品的详细信息

      在这里,我将展示产品的细节,并将不得不列出所有的公司谁是消费。

    3. 公司-列表视图(查看完整列表)-将显示每个公司选择任何公司的详细信息

    顺便说一下,我现在正在储存。

    1. 仪表板收集-显示统计资料,如,总产品,总公司。。。

      { “时间”: “totalProducts”:数字长(1000), “totalCompanies”:“1.5”,

    2. 产品集合-将有以下详细信息。

    {
                    "productName" : "Small Box",
                    "total" : NumberLong(1000),
                    "weight" : "1.5",
                    "durability" : "20",
                    "companies" : [
                        {
                            "name" : "Nike",
                            "taken" : NumberLong(10)
                        },
                        {
                            "name" : "Reebok",
                            "taken" : NumberLong(20)
                        }
                    ]
        }
    
    1. 公司集合-将有以下详细信息
    {
                "companyName" : "Nike",
                "products" : [
                    {
                        "name" : "Small Box",
                        "taken" : NumberLong(10)
                    },
                    {
                        "name" : "Medium Box",
                        "taken" : NumberLong(20)
                    }
                ] 
    }
    

    因此,在每次运行时,我都会生成唯一的Id,并将此Id添加到存储的所有数据中。我只保存了最后两周的数据。超过2周的数据将每天清理。

    在这里,我会一直显示最新的数据。当用户进入产品或公司屏幕时,我将选择2个不同的集合。

    有没有更好的办法?

    2 回复  |  直到 6 年前
        1
  •  3
  •   IftekharDani    6 年前

    请检查一下它能帮你准备什么 架构 注:Mongo版本:3.6.5

    产品冷却

    /* 1 */
    {
        "_id" : ObjectId("5bb1e270269004e06093e178"),
        "productName" : "Small Box",
        "total" : NumberLong(1000),
        "weight" : "1.5",
        "durability" : "20",
        "companies" : [ 
            ObjectId("5bb1e2d2269004e06093e17b"), 
            ObjectId("5bb1e2d8269004e06093e17c")
        ],
        "date" : ISODate("2018-10-01T09:28:40.502Z")
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5bb1e293269004e06093e179"),
        "productName" : "Large Box",
        "total" : 1000.0,
        "weight" : "1.2",
        "durability" : "20",
        "companies" : [ 
            ObjectId("5bb1e2d8269004e06093e17c"), 
            ObjectId("5bb1e2de269004e06093e17d")
        ],
        "date" : ISODate("2018-10-01T09:28:40.502Z")
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5bb1e29d269004e06093e17a"),
        "productName" : "Medium Box",
        "total" : 1000.0,
        "weight" : "1.2",
        "durability" : "20",
        "companies" : [ 
            ObjectId("5bb1e2d2269004e06093e17b"), 
            ObjectId("5bb1e2d8269004e06093e17c"), 
            ObjectId("5bb1e2de269004e06093e17d")
        ],
        "date" : ISODate("2018-07-01T09:28:40.502Z")
    }
    

    /* 1 */
    {
        "_id" : ObjectId("5bb1e2d2269004e06093e17b"),
        "companyName" : "Nike"
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5bb1e2d8269004e06093e17c"),
        "companyName" : "Reebok"
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5bb1e2de269004e06093e17d"),
        "companyName" : "PUMA"
    }
    

    使用comapny获得单一产品

    db.getCollection('products').aggregate([{
          $match :  { "_id" : ObjectId("5bb1e270269004e06093e178") } },
           { $lookup : {
               from : 'company',
               foreignField : '_id',
               localField : 'companies',
               as : 'companies'
               }
           }
          ])
    

    所有有公司名单的产品

    db.getCollection('products').aggregate([
           { $lookup : {
               from : 'company',
               foreignField : '_id',
               localField : 'companies',
               as : 'companies'
               }
           }
          ])
    

    按id列出的公司及其使用的产品

      db.getCollection('company').aggregate([{
              $match :  { "_id" : ObjectId("5bb1e2d2269004e06093e17b") } },
               { $lookup : {
                   from : 'products',
                   foreignField : 'companies',
                   localField : '_id',
                   as : 'products'
                   }
               }
              ])
    

        db.getCollection('products').aggregate([{
              $match :  { 
                  date: {
                    $gte: new Date(new Date() - 7 * 60 * 60 * 24 * 1000)
            } } },
               { $lookup : {
                   from : 'products',
                   foreignField : 'companies',
                   localField : '_id',
                   as : 'products'
                   }
               }
        ])
    

    获取公司最新产品

    db.getCollection('products').aggregate([
           { $sort : { date : -1} },
           { $limit : 1},
           { $lookup : {
               from : 'company',
               foreignField : '_id',
               localField : 'companies',
               as : 'companies'
               }
           }
          ])
    
        2
  •  0
  •   Lars Hendriks    6 年前

    因此,在每次运行时,我都会生成唯一的Id,并将此Id添加到存储的所有数据中。我只保存了最后两周的数据。超过2周的数据将每天清理。

    我不会这样做的。我会用mongodb自动给你的id。并创建一个runobject来收集所有这些对象的id。因为每个对象有一个键比336个键(48个(每天30分钟)x14个(两周内的几天))要好

    我将创建一个run对象,其中包含公司id、产品id和时间戳的数组。如果在30分钟内没有任何变化,那么我可以使用runobject id(第一个相同的runobject id)和时间戳。所以你节省了很多空间。

    希望我能正确地理解你,因为这对我来说是一本难懂的书。