我有一个非常简单的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) 我有一个可查询的查询:
Query query = new Query().with(new PageRequests(page, size))
Run Code Online (Sandbox Code Playgroud)
如何使用MongoTemplate执行它?我没有看到一个方法返回Page<T>.
我最近发现了GridFS,我想将其用于带元数据的文件存储.我只是想知道是否可以使用a MongoRepository来查询GridFS?如果是的话,有人可以举个例子吗?
如果有的话,我也会使用Hibernate来解决问题.
原因是:我的元数据包含许多不同的字段,查询存储库比new Query(Criteria.where(...))为每个方案编写一些更容易.我希望也可以简单地使用Java对象并通过REST API提供它而不需要文件本身.
编辑:我正在使用
我有以下类要使用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.
缺什么?
我正在开发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)
OrderDetailsService.java
public interface OrderDetailsService {
List<OrderDetails> findAllBy(Integer searchValue);
}
Run Code Online (Sandbox Code Playgroud)
OrderDetailsServiceImpl.java
@Component
public class OrderDetailsServiceImpl implements OrderDetailsService{
@Autowired
private OrderDetailsRepository odRepository; …Run Code Online (Sandbox Code Playgroud) 如何将以下 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
我做了一个实验......两个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具有以下外观: …
我正在使用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
如何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?
我有一个有两个日期字段的集合,我试图查询所有相差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)