Mongo聚合调用中的更细粒度限制?

时间:2016-11-10 17:04:38

标签: mongodb database-performance

我想在Mongo上运行一个查询。基本上它看起来像这样:

db.getCollection('termStatistics').aggregate(
    { $filter: { "kind": 0 } },
    {
        $group:
        {
            "_id": "$termId",
            "count": {$sum: NumberLong(1)}
        }
    },
    { $sort: {"count": -1} },
    { $limit: 100 }
)

这会获得每个termId的计数,并为我提供前100名。但是,我必须为kind的每个值运行相同的查询,其中有几个,因为用户想要每个类别的前100名。我想避免多次回到mongo进行单次查询(实际的过滤器也会进行一些特定于用户的过滤,因此缓存结果是不合理的。)

是否可以将所有这些组合成一个聚合调用?每种价值的某种限制"还是什么?

编辑:以下是一些示例文档。这些都有点愚蠢,但很难发布成千上万的文件,对他们感兴趣....假设我已经有n份这些文件(变化_id s)对于1到1000之间的每个n

{ kind: 0, termId: n }

此外,我已经获得了nn,每个{ kind: 1, termId: n } 介于1和100之间:

termId

我想要的是各种前100名kind: 0。对于[{ _id: 1000, count: 1000 }, ...{ _id: 901, count: 901 }],这将是kind: 1,对于[{ _id: 200, count: 200 }, ..., { _id: 101, count: 101 }],这将是[ { kind: 0, data: [{ _id: 1000, count: 1000 }, ...{ _id: 901, count: 901 }]}, { kind: 1, data: [{ _id: 200, count: 200 }, ...{ _id: 101, count: 101 }]}, ]

这很容易,但需要两次聚合调用(见上文)。做一个聚合调用并获得之类的以下内容会很好:

kind: 1

如果我们只是将限制提高到200,我们就无法从termId获得任何内容,因为kind: 0有足够的常见Realm realm = getNewRealmInstance(); try { realm.beginTransaction(); Record newRecord = new Record().setField1(x).setField2(y); realm.copyToRealm(newRecord); realm.commitTransaction(); } catch (Throwable error) { realm.cancelTransaction(); } finally { realm.close(); } ,所以我就这样做了需要一些其他类型的限制,或者一些非常巧妙的使用它。

希望更清楚!

1 个答案:

答案 0 :(得分:0)

不是100%肯定你正在尝试做什么,但你可以尝试分组" kind"字段和术语,而不是首先使用$ match或$ filter。

类似的东西:

db.getCollection('termStatistics').aggregate(
    {
        $group: {
            "_id": {
                "kind": "$kind",
                "term": "$termId"
            },
            "count": {
                $sum: NumberLong(1)
            }
        }
    },
    { $sort: {"count": -1} },
    { $limit: 100 }
)