mongodb - 在 Spring data mongo query-dsl 中过滤嵌套映射值

标签 mongodb mongodb-query spring-data spring-data-mongodb querydsl

我正在将 Spring-Data-mongo 与 query-dsl 集成,因此我需要为 query-dsl 查询生成 Q 文件 这是我的订单 POJO:

public class Order {
    private List<Map<String,Object>> items;
}

我的Order.java Q文件

public class QOrder extends EntityPathBase<Order> {

    private static final long serialVersionUID = -682690651L;

    public static final QOrder order = new QOrder("order");

    public final ListPath<java.util.Map<String, Object>, SimplePath<java.util.Map<String, Object>>> items = this.<java.util.Map<String, Object>, SimplePath<java.util.Map<String, Object>>>createList("items", java.util.Map.class, SimplePath.class, PathInits.DIRECT2);

    public QOrder(String variable) {
        super(Order.class, forVariable(variable));
    }

    public QOrder(Path<? extends Order> path) {
        super(path.getType(), path.getMetadata());
    }

    public QOrder(PathMetadata metadata) {
        super(Order.class, metadata);
    }
}

示例 json 的顺序是

{
    "items": [{
        "itemName": "phone",
        "quantity": <Integer-Number>
    }
    ]
}

现在我想从 mongo 检索所有存在数量为 1 的项目的订单。 现在我正在生成我的谓词,如下所示。 “QSensorData.sensorData.data.any().eq(Some-QueryDSL-Expression)”。

我无法确定需要传入 eq 方法来过滤嵌套映射值。

最佳答案

更改 Order 类以包含 List 属性,其中 Item 包含 itemName 和数量字段。类似的东西

public class Order {
    private List<Item> items;
}

public class Item {
    private String itemName;
    private Integer quantity;
}

生成 Q 类。

使用以下查询返回至少有一件商品数量为 1 的所有商品。

BooleanExpression expression = QOrder.order.items.any().quantity.eq(1);
List<Order> results = repository.findAll(expression);

正如评论中所述,要返回所有值为 1 的过滤项,您必须使用聚合查询。

类似

静态导入

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;

聚合查询

Aggregation aggregation = newAggregation(
           project().and(filter("items")
             .as("item")
             .by(valueOf(
                  "item.quantity")
                   .equalToValue(
                  1)))
          .as("items");
);

List<Order> results = mongoTemplate.aggregate(aggregation, Order.class, Order.class)

关于mongodb - 在 Spring data mongo query-dsl 中过滤嵌套映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53929308/

相关文章:

java - Spring Data @Query 使用 VARCHAR 而不是 NVARCHAR

mysql - 具有现有值的 Spring Data UPDATE 查询

javascript - Mongoose findOneAndUpdate 和 upsert 不返回错误,不影响文档

json - 选择具有特定键值对但不具有其他键值对的文档

mongodb - 从其他服务器访问 MongoDB

javascript - MongoDB 从聚合中排除某些文档

mongodb - 添加新字段,该字段是文档另一个字段的大小

Spring 数据 mongodb 存储库。如何通过 ID 列表进行搜索?

mongodb - Mongodb 嵌套分片键

javascript - Loopback API - 我可以更改 API 中显示的内容吗?