我想在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 }
此外,我已经获得了n
个n
,每个{ 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();
}
,所以我就这样做了需要一些其他类型的限制,或者一些非常巧妙的使用它。
希望更清楚!
答案 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 }
)