标签: spring-data-mongodb

如何让Spring-Data-MongoDB验证我的对象?

我有一个非常简单的Spring Boot应用程序,它使用Spring-Data-Mongodb

我想要做的就是设置一个JSR-303验证规则,说明我保存的对象必须有一个用户名.我读到JSR-303被添加到版本1.1中的spring-data-mongodb中,所以我假设当我保存一个对象时它已经过验证,但事实并非如此.

有没有人有一个简单的示例设置,显示它是如何工作的?

我的用户pojo看起来像

public class User {

    @Id
    private String id;

    @NotNull(message = "User Name is compulsory")
    private String userName;
    private String password;

    public User() {}

    public String getId() {
      return id;
    }
    public void setId(String id) {
      this.id = id;
    }

    public String getUserName() {
      return userName;
    }
    public void setUserName(String userName) {
      this.userName = userName;
    }


    public String getPassword() {
      return password;
    }
    public void setPassword(String password) {
      this.password = PasswordAuthService.hash(password);
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到某个地方,如果你在上下文中创建了一个验证器,验证只会启动,所以我尝试更新我的Application类(包含所有配置,看起来像

@Configuration
@ComponentScan …
Run Code Online (Sandbox Code Playgroud)

mongodb bean-validation spring-data-mongodb spring-boot

17
推荐指数
2
解决办法
9563
查看次数

用mongoTemplate分页

我有一个可查询的查询:

Query query = new Query().with(new PageRequests(page, size))
Run Code Online (Sandbox Code Playgroud)

如何使用MongoTemplate执行它?我没有看到一个方法返回Page<T>.

java spring-data spring-data-mongodb

17
推荐指数
3
解决办法
2万
查看次数

可以通过Repository访问Spring Data + MongoDB GridFS吗?

我最近发现了GridFS,我想将其用于带元数据的文件存储.我只是想知道是否可以使用a MongoRepository来查询GridFS?如果是的话,有人可以举个例子吗?

如果有的话,我也会使用Hibernate来解决问题.

原因是:我的元数据包含许多不同的字段,查询存储库比new Query(Criteria.where(...))为每个方案编写一些更容易.我希望也可以简单地使用Java对象并通过REST API提供它而不需要文件本身.

编辑:我正在使用

  • Spring 4 Beta
  • Spring Data Mongo 1.3.1
  • Hibernate 4.3 Beta

spring mongodb gridfs spring-data spring-data-mongodb

16
推荐指数
1
解决办法
9167
查看次数

使用SpringData-MongoDB将Java 8 Instant存储为BSON日期

我有以下类要使用Spring Data存储在MongoDB中

@Document()
public class Tuple2<T extends Enum<T>> {

@Id
private String id;

@Indexed
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private final Instant timeCreated;

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

DateTimeFormat注释javadoc状态:

声明字段应格式化为日期时间.支持按样式模式,ISO日期时间模式或自定义格式模式字符串格式化.可以应用于java.util.Date,java.util.Calendar,java.long.Long,Joda-Time值类型; 从Spring 4和JDK 8开始,到JSR-310也是java.time类型.

我使用的是Spring 4.1.1和JDK 8,所以我希望它适用于Instant.但是,这是实际存储的内容:

"timeCreated" : {
    "seconds" : NumberLong(1416757496),
    "nanos" : 503000000
}
Run Code Online (Sandbox Code Playgroud)

如果我从即时到日期编写和注册自定义转换器,就像在这个答案中解释的一样,那么它是有效的,但是我想避免这种情况,因为我确信必须有更好的方法.

在进一步挖掘Spring源代码之后,我发现了以下Jsr310DateTimeFormatAnnotationFormatterFactory看起来很有希望的类:

使用JDK 8中的JSR-310 java.time包格式化使用DateTimeFormat注释注释的字段.

它的'源代码没有引用Instant,但确实引用了OffsetTime和LocalTime.即便如此,当我在我的示例中将Instant更改为OffsetDateTime时,它仍然存储为复合对象而不是ISODate.

缺什么?

java spring spring-data spring-data-mongodb java-time

16
推荐指数
1
解决办法
2870
查看次数

文本搜索不使用Spring Boot MongoDB

我正在开发Spring Boot + MongoDB + spring data mongo + Text search示例.通过链接参考:https://spring.io/blog/2014/07/17/text-search-your-documents-with-spring-data-mongodb,我开发了我的代码,但当我执行时,它给出了空结果集.请帮助这个场景.我期待得到两者results OrderId = 10248 and 10249,但我得空了.

我开发的代码:OrderDetails.java

@Document(collection="order-details")
public class OrderDetails {

    @Id
    private ObjectId id;

    //@TextIndexed(weight=2)
    @Field("OrderID")
    private Integer orderID;

    @Field("ProductID")
    private Integer productID;

    @Field("UnitPrice")
    private Double unitPrice;

    @Field("Quantity")
    private Integer quantity;

    @Field("Discount")
    private Integer discount;
        // setters and getters
}
Run Code Online (Sandbox Code Playgroud)

OrderDetailsS​​ervice.java

public interface OrderDetailsService {
    List<OrderDetails> findAllBy(Integer searchValue);
}
Run Code Online (Sandbox Code Playgroud)

OrderDetailsS​​erviceImpl.java

@Component
public class OrderDetailsServiceImpl implements OrderDetailsService{

    @Autowired
    private OrderDetailsRepository odRepository; …
Run Code Online (Sandbox Code Playgroud)

java spring-data-mongodb spring-boot

16
推荐指数
1
解决办法
2145
查看次数

Spring Data MongoDB Lookup with Pipeline Aggregation

如何将以下 MongoDB 查询转换为 Java Spring 应用程序要使用的查询?我找不到使用pipeline提供的查找方法的方法。

这是我试图转换的查询。我还想指出,我没有使用,$unwind因为我希望将deliveryZipCodeTimings保留为返回对象中的分组集合。

db.getCollection('fulfillmentChannel').aggregate([
    {
        $match: {
            "dayOfWeek": "SOME_VARIABLE_STRING_1"
        }
    },
    {
        $lookup: {
            from: "deliveryZipCodeTiming",
            let: { location_id: "$fulfillmentLocationId" },
            pipeline: [{
                $match: {
                    $expr: {
                        $and: [
                            {$eq: ["$fulfillmentLocationId", "$$location_id"]},
                            {$eq: ["$zipCode", "SOME_VARIABLE_STRING_2"]}
                        ]
                    }
                }
            },
            { 
                $project: { _id: 0, zipCode: 1, cutoffTime: 1 } 
            }],
            as: "deliveryZipCodeTimings"
        }
    },
    {
        $match: {
            "deliveryZipCodeTimings": {$ne: []}
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

spring mongodb spring-data aggregation-framework spring-data-mongodb

16
推荐指数
2
解决办法
2万
查看次数

Spring数据mongodb.生成id的错误

我做了一个实验......两个Spring数据库的一个共同实体: - JPA - MongoDB

首先,我使用以下库版本:

spring-data-jpa:1.7.0.RELEASE spring-data-mongodb:1.6.0.RELEASE

我有一个实体:

@Entity
@Table(name = "ACCOUNTS")
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ACCOUNT_ID")
    private Long id;

    @Column(name = "ACCOUNT_NUMBER")
    private String number;

    public Account() {
    }

    public Account(String number) {
        this.number = number;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}
Run Code Online (Sandbox Code Playgroud)

JPA Repository具有以下外观: …

java mongodb spring-data spring-data-mongodb

15
推荐指数
4
解决办法
3万
查看次数

使用Spring数据创建一个上限集合MongoDB @Document

我正在使用MongoDB尝试spring-data中的反应支持.我使用的是spring-boot 2.0.0.

通常我会在我的项目中写一个这样的域对象:

@Document
public class PriceData {
    ......
}
Run Code Online (Sandbox Code Playgroud)

使用这个spring-data,它将在MongoDB中创建一个名为priceData的集合.如果我想自定义它,那么我会使用collection属性来做:

@Document(collection = "MyPriceData")
Run Code Online (Sandbox Code Playgroud)

由于我想尝试MongoDB的反应支持,我想创建一个上限集合,以便我可以使用@Tailable游标查询.

我可以在我的MongoDB数据库中创建一个封顶集合作为指定在这里:

CollectionOptions options = new CollectionOptions(null, 50, true);
mongoOperations.createCollection("myCollection", options);
Run Code Online (Sandbox Code Playgroud)

要么

db.runCommand({ convertToCapped: 'MyPriceData', size: 9128 })
Run Code Online (Sandbox Code Playgroud)

如果我使用一些外部MongoDB数据库,我可以运行此命令一次,这不是一个大问题.但是如果我使用嵌入式MongoDB,那么我会把它放在一个每次启动时都要执行的类中.

无论哪种方式,我都会在第一次请求之前创建一个集合.所以我想知道是否有办法,我可以指定spring-data-mongodb我需要一个上限集合而不是常规集合.不幸的是@Document在这种情况下无济于事.

spring mongodb spring-data-mongodb spring-boot capped-collections

15
推荐指数
1
解决办法
1245
查看次数

如何在不破坏自动配置的情况下自定义Spring-Boot中的MappingMongoConverter(setMapKeyDotReplacement)?

如何MappingMongoConverter在不更改由spring-data自动配置的任何mongo-stuff的情况下自定义Spring-Boot-Application(1.3.2.RELEASE)中的内容?

我目前的解决方案是:

@Configuration
public class MongoConfig {

  @Autowired
  private MongoDbFactory mongoFactory;

  @Autowired
  private MongoMappingContext mongoMappingContext;

  @Bean
  public MappingMongoConverter mongoConverter() throws Exception {
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoFactory);
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
    //this is my customization
    mongoConverter.setMapKeyDotReplacement("_");
    mongoConverter.afterPropertiesSet();
    return mongoConverter;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方式还是我打破了一些东西?
或者是否有更简单的方法来设置mapKeyDotReplacement?

spring-data spring-data-mongodb spring-boot

14
推荐指数
3
解决办法
6295
查看次数

Spring MongoDB查询文件,如果天差为x天

我有一个有两个日期字段的集合,我试图查询所有相差15天的记录:

{
   "_id" : "someid",
   "factoryNumber" : 123,
   "factoryName" : "some factory name",
   "visitType" : "audit",
   "personelId" : "somePersonel",
   "lastVisit": ISODate("2018-10-30T00:00:00.000+0000"),
   "acceptedDate" : ISODate("2018-11-16T00:00:00.000+0000")
}
Run Code Online (Sandbox Code Playgroud)

现在在某些情况下acceptedDate不会出现,所以我需要根据当前日期对其进行评估.不完全确定如何在spring中编写这种类型的查询以获得期望的结果.

    Criteria.where("acceptedDate"). 
(is 15 days past last visit or current date if last visit not present)
Run Code Online (Sandbox Code Playgroud)

java criteria mongodb spring-data-mongodb spring-boot

14
推荐指数
1
解决办法
737
查看次数