【问题标题】:Filter list of objects by id list in MongoTemplate aggregate在 MongoTemplate 聚合中按 id 列表过滤对象列表
【发布时间】:2020-06-18 19:44:56
【问题描述】:

我有如下操作的一部分

 mongoTemplate.aggregate(
        newAggregation(unwind("catalogItems"),
            group("catalogItems._id").addToSet("catalogItems.modifierId").as("modIds").addToSet(
                new BasicDBObject("_id", "$recipe._id").append("name", "$recipe.name")
                    .append("menuId", "$recipe.menuId").append("status", "$recipe.status")
                    .append("modifierList",
        new BasicDBObject("modifiers", new BasicDBObject("id", new BasicDBObject("$in", "$modIds")))))
                .as("recipeList")),
        "table", Ingredient.class).getMappedResults();

这里我要做的是分配包含 $modIds 中的 id 的修饰符。

modifierList - the property I'm going to assign the result with filtered modifiers
modifiers - input list that contains all elements
$modIds - modifier ids got by previous projection

当我尝试这个时,我得到以下错误

Expression $in takes exactly 2 arguments. 1 were passed in.' on server

我认为我的语法不对。但我找不到符合我要求的工作示例。知道怎么做吗?

【问题讨论】:

  • 您需要显示使用完整的查询。好像您想搜索 $in 文档的字段?在这种情况下,您应该使用Operator expresion
  • 我已经更新了代码

标签: mongodb mongodb-query aggregation-framework mongotemplate


【解决方案1】:

试试这个:

Aggregation agg = newAggregation(
    unwind("catalogItems"), 
    match(Criteria.where("catalogItems.name").regex("^" + name, "i")),
    group("catalogItems._id", "catalogItems.name","catalogItems.status")
        .addToSet("catalogItems.modifierId").as("modIds")
        .addToSet(new Document("_id", new Document("$toString","$recipe._id"))
                .append("name", "$recipe.name")
                .append("menuId", "$recipe.menuId")
                .append("modifiers","$modifiers")).as("recipeList"), 
    project()
        .and("_id._id").as("_id")
        .and("_id.name").as("name")
        .and("_id.status").as("status")
        .and(op -> new Document("$map", 
                new Document("input", "$recipeList")
                    .append("as", "recipe")
                    .append("in", new Document("id","$$recipe._id")
                            .append("name", "$$recipe.name")
                            .append("status", "$$recipe.status")
                            .append("menuId", "null")
                            .append("modifiers", new Document("$map", 
                                new Document("input", new Document("$filter", 
                                    new Document("input", "$$recipe.modifiers")
                                        .append("as", "modif")
                                        .append("cond", new Document("$in", Arrays.asList("$$modif._id", "$modIds"))))
                                    ).append("as", "mod")
                                .append("in", new Document("id", "$$mod._id")
                                        .append("recipeId", "$$mod.recipeId")
                                        .append("displayName", "$$mod.displayName")
                                        .append("status", "$$mod.status"))))
                                ))).as("recipeList"));

mongoTemplate.aggregate(agg, "table", Ingredient.class).getMappedResults();

MongoPlayground

【讨论】:

  • 现在我收到此错误$in requires an array as a second argument, found: missing' on server
  • @Sandeepa 这意味着你有空的catalogItems 数组。分享一个示例数据,我会修复查询
  • 因为样本数据太长。我在这里与您聊天时分享了我的查询和示例数据。这样你就会有一个清晰的想法。非常感谢您的帮助:)
  • @Sandeepa 再次检查我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2023-02-06
相关资源
最近更新 更多