我正面临Spring Data MongoDB Criteria API orOperator问题.
这是不规则动词的查询结果:( 终端输出)
> db.verb.find({'v2':'wrote'});
{ "_id" : ObjectId("5161a8adba8c6390849da453"), "v1" : "write", "v2" : "wrote", "v3" : "written" }
Run Code Online (Sandbox Code Playgroud)
我使用Spring Data MongoDB Criteria API通过它们v1或v2值查询动词:
Criteria criteriaV1 = Criteria.where("v1").is(verb);
Criteria criteriaV2 = Criteria.where("v2").is(verb);
Query query = new Query(criteriaV1.orOperator(criteriaV2));
List<Verb> verbList = mongoTemplate.find(query, Verb.class)
Run Code Online (Sandbox Code Playgroud)
但不幸的verbList是没有任何项目.
我正在使用Spring-Data for MongoDB:
版本信息 - org.mongodb.mongo-java-driver版本2.10.1,org.springframework.data.spring-data-mongodb版本1.2.1.RELEASE.
我的案例与此处定义的案例类似,(对不起格式化......):
我刚开始使用spring-data-mongodb开发一些Java应用程序,并遇到了一些我无法解决的问题:
我有几个像这样的文档bean:
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
Foo foo;
// More fields and methods ...
}
@Document
public class FooImpl implements Foo {
String id;
String someField;
// some more fields and methods ...
}
Run Code Online (Sandbox Code Playgroud)
我有一个存储库类,其方法只是调用类似于此的查找:
public List<? extends Bar> findByFooField(final String fieldValue) {
Query query = Query.query(Criteria.where("foo.someField").is(fieldValue));
return getMongoOperations().find(query, BarImpl.class);
}
Run Code Online (Sandbox Code Playgroud)
保存一个Bar可以正常工作,它会将它保存在mongo中,同时保存为Foo和Bar的"_class"属性.但是,通过Foo中的某些属性查找会抛出这样的异常:
Exception in thread "main" java.lang.IllegalArgumentException: No
property someField found on test.Foo!
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)
at …Run Code Online (Sandbox Code Playgroud) 我有一个完美运行Spring Data MongoDB 1.4.2的项目.我尝试更新到1.5.0并在自动装配(提取)期间出现此错误:
org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ CyclicPropertyReferenceException:通过引起发现周期为路径类型"过滤器"字段的"规则""filter.rules"
在org.springframework.data.mongodb.core.index .MongoPersistentEntityIndexResolver $ CycleGuard.protect(MongoPersistentEntityIndexResolver.java:370)〜[spring-data-mongodb-1.5.0.RELEASE.jar:na]
at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ 2.doWithPersistentProperty(MongoPersistentEntityIndexResolver .java:144)〜[spring-data-mongodb-1.5.0.RELEASE.jar:na]
at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver $ 2.doWithPersistentProperty(MongoPersistentEntityIndexResolver.java:138)~ [spring -data-mongodb-1.5.0.RELEASE.jar:na]
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:294)〜[spring-data-commons-1.8.0.RELEASE.罐子:NA]
我有一个存储库"RulesDAO"只是扩展"MongoRepository".它管理名为"Rule"的实体.该实体具有一些基本字段和"过滤器"字段.此Filter类包含Filter列表(可以为空).
@Document(collection="rules")
public class Rule {
@Id private String id;
private String name;
// other fields
private Filter filter;
}
public class Filter {
// for groups
private String condition;
private List<Filter> rules = new ArrayList<Filter>();
// for query
private String field;
private String value;
}
Run Code Online (Sandbox Code Playgroud)
("规则"不是一个完美的名称,但它必须以这种方式命名为MVC绑定)
所以Filter.rules属性被解释为一个循环,它不是!(以及我对术语"循环"的理解)
它是发布中的错误还是这个用例有一个新的"标志"?
谢谢
对于背景故事,Filter类可以是叶子或用于构建复杂Criteria的树的节点,它是从矿山的jQuery插件的JSON构建的http://mistic100.github.io/jQuery-QueryBuilder
我在MongoDB中有一个包含这样的项目的集合:
{
"_id" : ObjectId("53e4d31d1f6b66e5163962e3c"),
"name" : "bob",
"nestedObject" : {
"_id" : ObjectId("53f5a623cb5e4c1ed4f6ce67")
//more fields...
}
}
Run Code Online (Sandbox Code Playgroud)
此项的Java表示如下所示:
public class SomeObject {
@Id
private String id;
private String name;
private NestedObject nestedObject;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
Repository接口定义如下:
public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
public List<SomeObject> findByName(String name);
public List<SomeObject> findByNestedObjectId(String id);
//some other find functions
}
Run Code Online (Sandbox Code Playgroud)
现在,findByName(String name)它应该正常工作,但findByNestedObjectId(String id)什么都不返回.
问题是:是否可以使用存储库接口通过嵌套对象的属性查找集合项?如果没有,建议的方法是什么?没有重新实现整个存储库是否可能?
我通过xml设置spring数据mongo自定义转换器,如下所示
<mongo:mapping-converter id="mongoConverter" db-factory-ref="mongoDbFactory">
<mongo:custom-converters>
<mongo:converter ref="customWriteConverter" />
<mongo:converter ref="customReadConverter" />
</mongo:custom-converters>
</mongo:mapping-converter>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongoDbFactory"/>
<constructor-arg ref="mongoConverter"/>
</bean>
<bean id="customWriteConverter" class="package.WriteConverter" />
<bean id="customReadConverter" class="package.ReadConverter" />
Run Code Online (Sandbox Code Playgroud)
在自定义读/写转换器中,我想重新使用spring-data-mongo的默认pojo转换器将某些属性保存为子文档.
考虑一个简化的例子 -
class A {
B b;
String var1;
int var2;
}
class B {
String var3;
String var4;
}
Run Code Online (Sandbox Code Playgroud)
我想使用customWriteConverter和处理A类的转换customReadConverter,但在我的自定义转换器中,我还想将B类的转换委托给spring-data-mongo的默认POJO转换器.
我怎样才能做到这一点?我无法成功将MongoConverter或MongoTemplate自动装入自定义转换器,因为MongoConverter/MongoTemplate bean在尝试创建自定义转换器时正在进行中.是否可以访问默认转换器并在自定义转换器中使用它?
我在Spring Data Mongodb中使用QueryDSL谓词.但是,我面临的情况是我必须使用MongoTemplate查询API(例如过滤从Mongo获取的字段).这是一个简单的例子:
public Stream<MyModel> findSummary(Predicate predicate){
Query query = new Query();
query.fields.include("field1").include("field2");
return mongoTemplate.stream(query, MyModel.class);
}
Run Code Online (Sandbox Code Playgroud)
我想将我的谓词转换为标准,以便我可以做类似的事情:
Query query = new Query();
query.addCriteria(XXXXX.toCriteria(predicate));
Run Code Online (Sandbox Code Playgroud)
但是我找不到这样的实用类.
我发现可以访问QueryDSL谓词,因此我开始实现自定义访问者(com.mysema.query.types.Visitor),但Criteria API并不是为此目的而设计的:例如实现简单的"和"运算符QueryDSL(com.mysema.query.types.Ops#AND)必须变成类似的东西
<result of left argument visit assumed to be a Criteria>.and("<path of right argument>").<operator of right argument>(<result of right argument visit>);
Run Code Online (Sandbox Code Playgroud)
有人可以提出一种方法来使QueryDSL Predicates和Spring Data Mongodb Query互操作吗?
谢谢
伯努瓦
我想实现一个删除集合中所有文档的删除方法。我在 Spring Data 中使用 mongo db。这可以在 Mongo shell 中使用 db.myCollection.remove({}) 来完成。但是我想在我的数据访问层中编写一个方法来做到这一点。我没有在我的 Dao 类中使用 MongodbTemplate。我想知道如何使用 Query 执行此操作。
Query query = new Query();
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我该怎么做。
我无法弄清楚如何使用spring-data-mongodb从GridFS流式传输二进制文件,以及GridFSTemplate当我已经拥有权限时ObjectId.
GridFSTemplate返回GridFSResource(getResource())或GridFSFile(findX()).
我可以GridFSFile通过ID 获取:
// no way to get the InputStream?
GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)))
Run Code Online (Sandbox Code Playgroud)
但没有明显的路怎么走一个InputStream为GridFSFile.
只有GridFSResource让我获得corresonding的保持InputStream用InputStreamResource#getInputstream.但获得一个的唯一方法GridFSResource是通过它filename.
// no way to get GridFSResource by ID?
GridFSResource resource = gridFsTemplate.getResource("test.jpeg");
return resource.getInputStream();
Run Code Online (Sandbox Code Playgroud)
不知何故,GridFsTemplateAPI意味着文件名是唯一的 - 它们不是.该GridFsTemplate实现只返回的第一个元素.
现在我正在使用本机MongoDB API,一切都有意义:
GridFS gridFs = new GridFs(mongo);
GridFSDBFile nativeFile = gridFs.find(blobId);
return nativeFile.getInputStream();
Run Code Online (Sandbox Code Playgroud)
看起来我误解了Spring …
对于Java枚举类型,我了解到MongoDB有两种解决方案:序列化和使用Jackson的ObjectMapper.MongoRepository可以使用这些方法中的任何一种使用枚举数据类型,或者我必须编写自定义存储库吗?
在为MongoDB运行Java应用程序时,我有以下异常:
[localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017 while accessing MongoDB with Java
Run Code Online (Sandbox Code Playgroud)
调用堆栈如下:
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongodb-driver-core-3.0.4.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:114) ~[mongodb-driver-core-3.0.4.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127) ~[mongodb-driver-core-3.0.4.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_45]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_45]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) ~[na:1.8.0_45]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_45]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_45]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_45]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_45]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_45]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) ~[mongodb-driver-core-3.0.4.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongodb-driver-core-3.0.4.jar:na]
... 3 common frames omitted
Run Code Online (Sandbox Code Playgroud)
这两个名字都不属于我的申请.我在本地主机上也没有MONGODB服务器.我正在使用远程主机并稍后进行设置.关于Mongo的任何陈述之前都会发生异常.
UPDATE
这可能是一些 …