我正在使用带有mongodb的spring数据来存储二进制数据,例如图像等.我想维护一个版本字段以附加到url,以便从缓存图像中欺骗浏览器.
请参阅下面的文档基类:
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.index.Indexed;
public abstract class BaseDocument {
@Id
@Indexed(unique=true)
protected long id;
protected byte[] data;
protected String mimeType;
protected String filename;
protected String extension;
@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)
我还有一个包装MongoOperations的存储库来保存我的文档.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class DocumentRepository implements IDocumentRepository {
@Autowired
private MongoOperations mongoTemplate;
@Override
public <D extends BaseDocument> void saveDocument(D document) {
mongoTemplate.save(document);
}
Run Code Online (Sandbox Code Playgroud)
为了实现版本控制,我做了一些狩猎,发现有一个@Version注释为spring mongo,但是已被弃用.然后我发现应该使用spring数据@Version注释.所以我继续使用弹簧数据@Version注释.
我期望发生的是每次保存文档时我的版本字段都会增加.我多次覆盖同一个文档,但我的版本字段并没有像我期望的那样增加.
我做错了什么或者我还需要做些什么吗?
我有一个具有以下结构的mongodb集合term
{
"_id" : "00002c34-a4ca-42ee-b242-e9bab8e3a01f",
"terminologyClass" : "USER",
"code" : "X67",
"terminology" : "some term related notes",
"notes" : "some notes"
}
Run Code Online (Sandbox Code Playgroud)
和一个表示术语集合的java类 Term.java
@Document
public class Term{
@Id
protected String termId;
@Indexed
protected String terminologyClass;
@Indexed(unique=true)
protected String code;
@Indexed
protected String terminology;
protected String notes;
//getters & setters
}
Run Code Online (Sandbox Code Playgroud)
我term收藏了很多文件.现在我添加了一个新字段Term.javaas
@Indexed
protected String status;
Run Code Online (Sandbox Code Playgroud)
添加字段status后Term.java,在向term集合中插入新术语时,我得到了一个例外:
com.mongodb.MongoException:带名称的索引:代码已经存在,具有不同的选项
我使用的是MongoDB版本:2.6.5和spring-data-mongodb版本:1.3.2
我有2个Mongodb数据库连接到一个带有2个MongoTemplate-s的Spring Boot应用程序:
mongoTemplate(默认的bean名称,连接到默认的db)
mongoAppTemplate(在运行时连接到另一个数据库)
我有很多使用mongoTemplate的MongoRepository-s但我也想创建一些使用mongoAppTemplate的东西.
如何配置2个MongoRepository-s以使用不同的MongoTemplate -s和Java配置?
我找到了一种方法来使用XML(下面的链接),但我真的想保持它所有的注释
spring spring-mvc spring-data spring-data-mongodb spring-boot
我是Spring Data Mongo的新手,所以我一定做错了,因为我无法设法执行这么简单的查询.这是我的模特:
@Document(collection="brands")
public class Brand{
@Id
private int id;
private String name;
...
//getters-setters
}
@Document(collection="models")
public class Model{
@Id
private int id;
private String name;
@DBRef
private Brand brand;
...
//getters-setters
}
Run Code Online (Sandbox Code Playgroud)
我想从一个品牌获得所有模型,所以我实现DAO如下:
@Repository
public interface IModelDAO extends MongoRepository<Model, Integer>{
@Query(value="{ 'brand.$id' : ?0 }")
public List<Model> findByBrandId(Integer id);
}
Run Code Online (Sandbox Code Playgroud)
如果我在shell中执行这个mongodb查询,它可以工作: db.modelss.find({ 'brand.$id' : 1 })
但是,Java应用程序抛出以下异常:
Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
Run Code Online (Sandbox Code Playgroud)
显然它正在寻找Brand类中的字段$ id,因为它不存在,所以它失败了.所以我将查询更改为以下内容,以便导航到id字段:
@Query(value="{ 'brand.id' : ?0 }")
Run Code Online (Sandbox Code Playgroud)
现在,它不会抛出异常,但它在DB中找不到任何内容.
调试MongoTemplate.executeFindMultiInternal()方法可以看到它
DBCursor cursor = null;
try { …Run Code Online (Sandbox Code Playgroud) 我的代码需要支持客户端发送的任何查询.客户端将以json的形式发送查询.我使用java mongo驱动程序低级api使用以下代码完成此操作,BasicDBObject queryObject = (BasicDBObject) JSON.parse(whereJson.toString());
因为我是spring数据mongodb中的新手,我无法在Query或Criteria类中找到类似的解决方案.我检查了不同的教程,但找不到任何教程.有可能在spring数据mongodb中做或者我应该使用低级apis本身吗?
我对spring数据mongodb存储库有一个奇怪的问题..我想从我的findAll请求中排除一个字段.我怎样才能做到这一点?
这非常有效:
@Query(fields = "{'objectContentAsJson':0}")
Page<ObjectHistory> findByObjectIdAndServiceIgnoreCase( String objectId, String service, Pageable pageable );
Run Code Online (Sandbox Code Playgroud)
但没有机会findAll:
@Query(fields = "{'objectContentAsJson':0}")
Page<ObjectHistory> findAll( Pageable pageable );
Run Code Online (Sandbox Code Playgroud)
抛出:
引起:org.springframework.data.mapping.PropertyReferenceException:找不到类型为ObjectHistory的属性findAll!org.springframework.data.mapping.PropertyPath.(PropertyPath.java:75)位于org.springframework.data.mapping.PropertyPath.create的org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327) PropertyPath.java:307)org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:241)atg.springframework.data .repository.query.parser.Part.(Part.java:76)
我想用正则表达式查询使文本搜索大小写不敏感spring-data mongo .
例如在Oracle中:
select * from user where lower(username) like '%ab%'
我该如何进行此查询spring-data mongo ?
提前致谢
在Spring Data中,我们PagingAndSortingRepository继承了它CrudRepository.在反应式Spring数据中,我们只有
ReactiveSortingRepository继承自ReactiveCrudRepository.我们怎么能以反应的方式进行分页呢?例如,我们将来能够做到这一点ReactivePagingAndSortingRepository吗?
是否可以MongoDB使用src/main/resources/data.sql或通过任何其他文件在数据库中加载初始数据?
据我所知,data.sql用于SQL数据库的,而MongoDB一个NOSQLDB.但只是想知道是否有任何等同data.sql于NOSQL数据库的.
谷歌搜索时我发现了这个SO链接(Spring Boot - 正在加载初始数据),它正在寻找我正在寻找的东西,但它仍然不是一个独立的文件data.sql.
我想探索MongoDB的新事务功能,并使用Spring Data MongoDB。但是,我收到异常消息“ 此客户端连接到的MongoDB群集不支持会话 ”。任何有关MongoDB 3.7.9的配置的提示都值得赞赏。
stacktrace以以下内容开头:
com.mongodb.MongoClientException:该客户端在com.mongodb.MongoClient.startSession(MongoClient.java:555)〜[mongodb-driver-3.8.0-beta2.jar:na)连接到的MongoDB群集不支持会话] org.springframework.data.mongodb.core.SimpleMongoDbFactory.getSession(SimpleMongoDbFactory.java:163)〜[spring-data-mongodb-2.1.0.DATAMONGO-1920-SNAPSHOT.jar:2.1.0.DATAMONGO-1920-快照]
mongodb ×6
java ×5
spring-data ×5
spring ×3
spring-boot ×2
mongodb-java ×1
nosql ×1
repository ×1
spring-mvc ×1
versioning ×1