在 MongoTemplate 聚合中按 id 列表过滤对象列表
Filter list of objects by id list in MongoTemplate aggregate
我有部分操作如下
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
我觉得我的语法不对。但是我找不到符合我要求的工作示例。知道怎么做吗?
试试这个:
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();
我有部分操作如下
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
我觉得我的语法不对。但是我找不到符合我要求的工作示例。知道怎么做吗?
试试这个:
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();