标签: spring-mongo

如何使用spring数据在mongo聚合中构建$group的组合_id属性?

我在 mongodb 文档中找到了这个 mongo 命令:

db.sales.aggregate( 
   [ 
      { 
        $group : { 
           _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } }, 
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, 
           averageQuantity: { $avg: "$quantity" }, 
           count: { $sum: 1 } 
        } 
      } 
   ] 
) 
Run Code Online (Sandbox Code Playgroud)

使用 spring 数据的聚合时,很容易通过调用 Aggregation.group(Feild ...) 将一个 Document 属性绑定到 $group 中的 _id

但是对于上述情况,_id 属性被组合在一起,我未能在 Java 中构建它。各位大侠有解决办法吗???我的意思是如何用Java表达上面的js??

非常感谢...

@update ..... $group 的 _id 使用 mongo 函数,如 $month …

java mongodb spring-mongo mongodb-query aggregation-framework

5
推荐指数
1
解决办法
2979
查看次数

Spring Data Rest /search 端点与 MongoDB 地理类型(圆、点)

我尝试使用 Spring Data REST 和 MongoDB 实现基于位置的搜索。首先我创建了一个模型。

public class Event {

    @Id
    private String id;

    private String name;
    private String description;
    private double[] position;

    .. getter setter ..
}
Run Code Online (Sandbox Code Playgroud)

其次,我添加了一个存储库。

public interface EventRepository extends MongoRepository<Event, String> {

    List<Event> findByName(@Param("name") String name);

    List<Event> findByPositionWithin(@Param("circle") Circle c);

    List<Event> findByPositionNear(@Param("point") Point p, @Param("distance") Distance d);

}
Run Code Online (Sandbox Code Playgroud)

但是现在我遇到了我不知道如何为findByPositionWithinfindByPositionNear调用/search端点的问题?我找不到任何关于如何将复杂类型传递给方法的参考文献或文档。

findByName 端点events/search/findByName?name=test运行良好。如何传递 circle 参数?我需要编写自定义消息转换吗?

希望有人有任何建议:)

java spring mongodb spring-mongo spring-data-rest

5
推荐指数
0
解决办法
282
查看次数

聚合项目组通过Spring Data提取日,月和年

要直接,我该怎么做:

group._id = { 
    year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
    month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] }, 
    day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
};
Run Code Online (Sandbox Code Playgroud)

用spring数据

我已经尝试了这个和其他一些形式并没有成功

Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(c),
                Aggregation.project("programa", "custo", "duracao", "dataHora")
                    .andExpression("dataHora").minus(25200000).extractDayOfMonth().as("dia")
                    .andExpression("dataHora").minus(25200000).extractMonth().as("mes")
                    .andExpression("dataHora").minus(25200000).extractYear().as("ano"),
                Aggregation.group("programa", "ano", "mes", "dia")
                    .count().as("count")
                    .sum("custo").as("valorTotal")
                    .sum("duracao").as("duracaoTotal")
                    .first("dataHora").as("dataHora"),
                Aggregation.sort(Direction.ASC, "dataHora")
        );
Run Code Online (Sandbox Code Playgroud)

我需要在mongodb中按天,月和年进行分组,否则我需要在代码中转换所有这些分组数据.

提前致谢

java mongodb spring-mongo mongodb-query aggregation-framework

5
推荐指数
1
解决办法
2186
查看次数

Spring Data mongo将空值插入数据库

我正在使用Spring数据mongo向Mongo插入一条记录,

这是我的代码mongoTemplate.save(person,“ personCollection”);

这是我的人对象

public class Person implements Serializable {
   int age;
   String address;
   String name;

//Getters and setters including hashcode and equals
}
Run Code Online (Sandbox Code Playgroud)

我的地址在此处为null,在将记录插入集合中之后,仅使用年龄和姓名填充数据

我知道mongodb将null值和noKey视为同一个东西,但是我的要求是甚至填充address:null以使架构保持一致如何使用Spring Data mongo做到这一点

当前o / p:{“ age”:21,“ name”:“ john Doe”}

预期的o / p:{“ age”:21,“ name”:“ john Doe”,“ address”:null}

java mongodb spring-mongo spring-data-mongodb

5
推荐指数
1
解决办法
4409
查看次数

如何在 Spring Data mongodb 中使用自定义过滤器进行分页和排序?

在 Spring Data JPA 中,我们有规范,并且可以使用规范进行分页和排序。

public interface JpaSpecificationExecutor<T> {

    T findOne(Specification<T> var1);

    List<T> findAll(Specification<T> var1);

    Page<T> findAll(Specification<T> var1, Pageable var2);

    List<T> findAll(Specification<T> var1, Sort var2);

    long count(Specification<T> var1);

}
Run Code Online (Sandbox Code Playgroud)

但在 MongoRepository 中无法使用此类功能。我尝试使用 QueryByExampleExecutor,但它非常有限 例如我想要过滤年份 >5 和 <20 的数据怎么办?但我想动态生成查询

spring-data spring-mongo spring-boot spring-mongodb

5
推荐指数
1
解决办法
3073
查看次数

Java Spring 枚举 Jackson Serializer 用于数据插入/获取

我正在尝试在我的项目中使用枚举,并且需要使用小写而不是大写将它们保存在 mongoDB 集合中。

我有一个带有值 String 字段的枚举和用 Jackson 的@JsonCreator和注释的 setter/getters @JsonValue

public enum State {
    GREEN   ("vert"),
    ORANGE  ("orange"),
    RED     ("rouge");

    private final String value;

    State(String val) {
        this.value = val;
    }

    @JsonCreator
    public static State fromValue(String value) {
        if (value != null) {
            for (State state : values()) {
                if (state.value.equals(value)) {
                    return state;
                }
            }
        }

        throw new IllegalArgumentException("Invalid state: " + value);
    }

    @JsonValue
    public final String toValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个使用这个枚举的类,如下所示:

@Document(collection …
Run Code Online (Sandbox Code Playgroud)

java spring json jackson spring-mongo

5
推荐指数
0
解决办法
1205
查看次数

文档 Mongo 中的字段名称 ID 嵌入对象为空

我在 mongo 文档中有 json 对象,例如:

{
    "_id" : "tuneeca_z_0915002",
    "variants" : [
        {
            "name" : "Z-0915002-Beige-S",
            "id" : "tuneeca_z_0915002_tuneeca_beige_base_s_size",
            "barCode" : "00017311"
        },
        {
            "name" : "Z-0915002-Beige-XS",
            "id" : "tuneeca_z_0915002_tuneeca_beige_base_xs_size",
            "barCode" : "00017312"
        },
        {
            "name" : "Z-0915002-Beige-M",
            "id" : "tuneeca_z_0915002_tuneeca_beige_base_m_size",
            "barCode" : "00017313"
        },
        {
            "name" : "Z-0915002-Beige-L",
            "id" : "tuneeca_z_0915002_tuneeca_beige_base_l_size",
            "barCode" : "00017314"
        },
        {
            "name" : "Z-0915002-Beige-XL",
            "id" : "tuneeca_z_0915002_tuneeca_beige_base_xl_size",
            "barCode" : "00017315"
        }
    ],
    "name" : "Z-0915002",
    "localSku" : "Z-0915002",
    "release" : {
        "id" : "tuneeca_premium", …
Run Code Online (Sandbox Code Playgroud)

spring-batch spring-mongo spring-boot

5
推荐指数
1
解决办法
1537
查看次数

使用mongoTemplate分页findDistinct

我正在使用自定义查询来选择使用findDistinct方法的字段。我尝试使用with方法将pageRequest传递给查询,但仍然得到了完整的结果。有什么办法可以将findDistinct的结果分页吗?

Query query = new Query();
query.addCriteria(Criteria.where("socialAction").in(socialActions));
query.addCriteria(Criteria.where("userId").is(userId));
if (excludedSubjectIds != null) {
    query.addCriteria(Criteria.where("subjectId").nin(excludedSubjectIds));
}
PageRequest pageRequest = PageRequest.of(0, 15);
query.with(pageRequest);
List<String> subjectId = mongoTemplate.findDistinct(query, "subjectId", SocialUserHistory.class, String.class);
Run Code Online (Sandbox Code Playgroud)

我期望有15个subjectId,但是目前我正在获取所有的subjectId。

spring-data spring-mongo mongotemplate

5
推荐指数
1
解决办法
80
查看次数

Spring Data MongoRepository 保存导致重复键错误

这是实体:

@Document
@Data
public class ApplicationUser {
    private String name;
    @Indexed(unique = true)
    private String email;
    private String organization = null;
    // other fields
}
Run Code Online (Sandbox Code Playgroud)

我使用他们的电子邮件获取该用户,然后更改他们的姓名。我使用ApplicationUserRepository的自动装配实例。

ApplicationUser applicationUser = applicationUserRepository.findByEmail("abc@gmail.com");
applicationUser.setName("John Doe 2");
Run Code Online (Sandbox Code Playgroud)

然后我尝试在数据库中再次更新这个实体:

applicationUserRepository.save(applicationUser);
Run Code Online (Sandbox Code Playgroud)

我在现场电子邮件中收到重复的密钥错误。为什么会这样?据我从文档中获得,如果 ObjectId 相同,save方法会更新同一个文档。既然我没有更改 objectId 那么为什么它在保存期间尝试创建一个新的 ApplicationUser ?

spring-data spring-mongo spring-boot

4
推荐指数
1
解决办法
3134
查看次数

嵌入文档中的 MongoDB 嵌套查找

我有这些收藏

采购订单

{
  "_id": "5f0104a8d0c3a06fc9c06625",
  "purchaseItems": [
    {
      "product": "5eff29e9e2708a0ca980762e",
      "quantity": 1
    },
    {
      "product": "5eff29e9e2708a0ca980762e",
      "quantity": 2
    }
  ],
  "totalQuantity": 0,
  "documentDate": {
    "$date": "2020-07-04T16:00:00.000Z"
  }
}
Run Code Online (Sandbox Code Playgroud)

产品

{
  "_id": "5eff29e9e2708a0ca980762e",
  "name": "name",
  "code": "code",
  "cost": "1",
  "srp": "1",
  "minimum": "1",
  "startEffectiveDate": {
    "$date": "2020-07-04T16:00:00.000Z"
  }
}
Run Code Online (Sandbox Code Playgroud)

如何将 buyItems 中的产品字段加入到产品集合中,该购买项目是一个嵌入式数组文档。我需要这样的东西。

{
  "_id": "5f0104a8d0c3a06fc9c06625",
  "purchaseItems": [
    {
      "product": {
        "_id": "5eff29e9e2708a0ca980762e",
        "name": "product name"
      },
      "quantity": 1
    },
    {
      "product": {
        "_id": "5eff29e9e2708a0ca980762e",
        "name": "product name 2"
      },
      "quantity": …
Run Code Online (Sandbox Code Playgroud)

lookup mongodb spring-mongo mongodb-query aggregation-framework

4
推荐指数
1
解决办法
2585
查看次数