gpt4 book ai didi

java - Spring 数据 - 从分组中计算不同的项目

转载 作者:行者123 更新时间:2023-11-29 05:02:32 25 4
gpt4 key购买 nike

我有访问用户地点的数据库,其中包含这样的 place_id 和 user_id

{place_id : 1, user_id : 1}
{place_id : 1, user_id : 1}
{place_id : 1, user_id : 2}
{place_id : 2, user_id : 3}
{place_id : 2, user_id : 3}

我想在每个地方获得不同用户的数量。我最终得到了以下本地 mongo 聚合:

db.collection.aggregate([{
$group: {
_id: "$place_id",
setOfUsers: {
$addToSet: "$user_id"
}
}
}, {
$project: {
distinctUserCount: {
$size: "$setOfUsers"
}
}
}])

现在我想用Spring Data来实现,现在的问题是$size在projection中的操作,因为Spring data API没有这个,至少我没有在引用资料中找到。

    GroupOperation group = Aggregation.group("place_id").addToSet("user_id").as("setOfUsers");
ProjectionOperation project = Aggregation.project(). .... ?

也许还有什么方法可以创建尺寸字段,而不是可以使用嵌套的 api:

Aggregation.project().and("distinctUserCount").nested( ???);

感谢任何帮助。

最佳答案

我将“一次性”回答这个问题,因此我不会解决您的“$project”问题,而是在这里建议有更好的方法。

$addToSet运算符将为您要求添加的元素创建一个“唯一”数组(或“集合”)。然而,它基本上是 $group 的另一种形式。本身,不同之处在于元素被添加到结果中的“数组”(或“集合”)。

这对于可伸缩性来说是“坏”的,因为您在这里的潜在问题是“集合”实际上超过了文档大小的 BSON 限制。也许现在还没有,但谁知道你现在编写的代码在十年后会做什么。

因此,由于 $group 实际上是同一件事,并且您还需要“两个”流水线阶段来获得“不同”计数,那么只需“两个”$group 阶段改为:

    Aggregation pipeline = newAggregation(
group(fields("place_id","user_id")),
group("_id.place_id").count().as("distinctUserCount")
);

相当于 shell:

[
{ "$group": {
"_id": { "place_id": "$place_id", "user_id": "$user_id" }
}},
{ "$group": {
"_id": "$_id.place_id",
"distinctUserCount": { "$sum": 1 }
}}
]

这是简单的代码,它更“可扩展”,因为单独的“user_id”值首先包含在管道中的单独文档中。因此,“第二个”$group(代替带有 $size 的 $project)“计算”已在第一个分组键中确定的不同金额。

了解限制和陷阱,并编写好代码。

关于java - Spring 数据 - 从分组中计算不同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com