【问题标题】:How to fetch N documents per-group after a group query in mongoengine?如何在 mongoengine 中的组查询后为每个组获取 N 个文档?
【发布时间】:2021-02-28 09:47:41
【问题描述】:

如果我有一个带有字段的 mongoengine 集合:

node_id = fields.StringField(max_length=255)
message = fields.StringField(max_length=255)

如何按node_id 分组并获得最大值。每个node_id 5 个文档?

例如: 如果数据库中的文档是:

然后,在按 node_id 分组并每组只获取 5 个文档后,预期的输出应该是这样的:

从文档和一些博客中,我能够提出以下查询,每个组仅提供 1 个文档:

Model.objects.aggregate({"$group": {"_id": "$node_id", "count": {"$sum": 1}, "sentence":{"$first": "$message"}}})

但我无法弄清楚每组获得最多 N 个文档的理想方法是什么?

【问题讨论】:

  • 你所说的“记录”是什么?文件?
  • 抱歉,条款不正确。我对不同数据库和公司内部使用的术语感到困惑。修复了反映“文档”而不是“记录”的术语。
  • 好的,如果您需要,请告诉我。

标签: mongodb aggregation-framework mongoengine


【解决方案1】:
Model.objects.aggregate([{ 
[
    {
        "$group" : {
            "_id" : "$node_id",
            "count" : {
                "$sum" : 1
            },
            "sentence" : {
                "$push" : "$message"
            }
        }
    },
    {
        "$addFields" : {
            "sentence" : {
                "$slice" : [
                    "$sentence",
                    {
                        "$cond" : [
                            {
                                "$gt" : [
                                    "$count",
                                    5
                                ]
                            },
                            5, 
                            "$count"
                        ]
                    }
                ]
            }
        }
    }
]])
  1. $Groupnode_id 提供的文件
  2. $addFields 选择
    • 如果 arr 大于 5,则为 5 项
    • arr 小于 5 的所有项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多