NoSQL 中的多重分组

Posted

技术标签:

【中文标题】NoSQL 中的多重分组【英文标题】:Multiple Grouping in NoSQL 【发布时间】:2019-02-02 02:14:21 【问题描述】:

我正在开发用于维护日常记录的计费软件。我正在使用 PyGTk(用于 UI)和 MongoDB(NoSQL)数据库。我以以下格式存储每张账单的记录


    "_id" : ObjectId("5b83f95a3859201d46385779"),
    "date" : "27/08/2018",
    "bill_number" : 7,
    "bill_amount" : 85,
    "payment_mode" : "Cash",
    "bill_content" : [
        
            "item_code" : 1,
            "item_name" : "abc",
            "item_count" : 1
        ,
        
            "item_code" : 2,
            "item_name" : "xyz",
            "item_count" : 2
        
    ]


    "_id" : ObjectId("5b83f95f3859201d4638577b"),
    "date" : "27/08/2018",
    "bill_number" : 8,
    "bill_amount" : 125,
    "payment_mode" : "Card",
    "bill_content" : [
        
            "item_code" : 3,
            "item_name" : "xyz",
            "item_count" : 2
        ,
        
            "item_code" : 2,
            "item_name" : "abc",
            "item_count" : 1
        
    ]


    "_id" : ObjectId("5b83f95f3859201d4638577b"),
    "date" : "27/08/2018",
    "bill_number" : 8,
    "bill_amount" : 125,
    "payment_mode" : "Online",
    "bill_content" : [
        
            "item_code" : 3,
            "item_name" : "abc",
            "item_count" : 1
        ,
        
            "item_code" : 2,
            "item_name" : "xyz",
            "item_count" : 3
        ,
        
            "item_code" : 1,
            "item_name" : "pqr",
            "item_count" : 1
        
    ]

我想从记录中得到以下内容:

    每日总金额 按付款方式分组的金额总和 每天每个项目的计数(如果可能)

样本输出


'date':'27/08/2018',
'total_amount': 335,
'payment_mode': ['Cash': 85,'Card': 125, 'Online': 125],
'item_count': ['abc':3,'xyz':5,'pqr':1]

我是 NoSQL 的新手,因此无法在一个查询中完成所有事情。请告诉我这是否可能,或者是否有更好的方法来存储记录。

【问题讨论】:

我对 NoSQL 也比较陌生,但我认为您可能必须开始使用一些二级索引。 NoSQL 不能像关系数据库那样处理数据。 NoSQL 数据的建模更多是通过考虑您要提出的问题,而不是如何存储数据。也许从这里开始? highlyscalable.wordpress.com/2012/03/01/… 感谢@mrunion 提供链接。我在建模时将 NoSQL 与关系数据库相关联。我会阅读并理解这些概念。 【参考方案1】:

如果您想要每条记录的特定属性,那么您可以通过创建游标并迭代其中的每条记录来轻松访问它。

假设你的集合名称是'billing_software',那么你可以使用下面的sn-p得到你想要的输出:

collection = db.billing.software
all_records = collection.find()

for records in all_records:
    temp = dict()
    temp['date'] = records['date]
    print(temp)

无论如何,回到你原来的问题。在您的情况下,您可能希望聚合集合,然后按日期对集合进行分组。

有用的链接: 1.https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/ 2.https://docs.mongodb.com/manual/reference/operator/aggregation/group/

【讨论】:

以上是关于NoSQL 中的多重分组的主要内容,如果未能解决你的问题,请参考以下文章

高效的多重分组

Pandas Dataframe 中分组的多重聚合

01背包完全背包多重背包分组背包总结

背包(01,完全,多重,分组)

具有多重嵌套表的分组方式和计数作为 LINQ 查询

多重DES