【发布时间】:2021-02-02 20:21:03
【问题描述】:
我有一个名为 Users 的集合,其中包含一个名为 Skills 的数组。
我使用以下代码展开技能数组并计算与每个技能关联的文档数:
Bson uw = unwind("$skills");
Bson sbc = sortByCount("$skills");
Bson limit = limit(10);
coll.aggregate(Arrays.asList(uw, sbc,limit)).forEach(printDocuments());
现在我想利用 $trim 和 $toLower 操作进行上述聚合,因为在数据库中,一些技能以不同的方式保存(例如,“CSS”、“CSS”和“css”)。
我可以通过以下聚合在 mongo shell 中执行此操作:
db.users.aggregate([{$unwind:"$skills"} , {$sortByCount:{$toLower:{$trim:{input:"$skills"}}}}])
但是我在用 Java 实现它时遇到了麻烦。
你有什么想法吗?
【问题讨论】:
-
$trim和$toLower是聚合字符串运算符。这些可以(在您的情况下)在$addFields或$project阶段中使用。 -
@prasad_ 我可以在没有
$addFields或$project的情况下在 mongo shell 中使用这些聚合:db.users.aggregate([{$unwind:"$skills"}, {$sortByCount:{$toLower:{$trim:{input:"$skills"}}}}])但我正在努力在 Java 中实现它。你能帮我解决这个问题吗? -
MongoDB Java 的Aggregates.sortByCount
-
@prasad_ 这个方法有一个参数:
filter而我的问题是com.mongodb.client.model.Filters类既不包含$trim 也不包含$toLower。我也试过sortByCount("$toLower:{$trim:{input:"$skills"}}"),但它不起作用。 -
在
$unwind阶段之后,您可以添加$addFields阶段并使用运算符$trim和$toLower- 应该没有任何问题。
标签: java mongodb aggregation-framework mongodb-java