标签: spring-data-mongodb

Spring Data MongoDB - Criteria API OrOperator无法正常工作

我正面临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通过它们v1v2值查询动词:

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-mongodb

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

Spring -Data MongoDB问题,字段是一个接口

我正在使用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)

java spring mongodb spring-data spring-data-mongodb

13
推荐指数
2
解决办法
7597
查看次数

使用Spring Data Mongo 1.5"发现循环"

我有一个完美运行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

java spring spring-data spring-data-mongodb

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

如何使用存储库接口在Spring Data中通过其嵌套对象的objectId查找集合?

我在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)什么都不返回.

问题是:是否可以使用存储库接口通过嵌套对象的属性查找集合项?如果没有,建议的方法是什么?没有重新实现整个存储库是否可能?

java spring mongodb spring-data-mongodb

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

spring data mongodb:从自定义转换器中访问默认的POJO转换器

我通过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 spring-data spring-data-mongodb

13
推荐指数
1
解决办法
1959
查看次数

Spring数据Mongodb:QueryDsl Predicate和Criteria API的互操作性

我在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互操作吗?

谢谢

伯努瓦

querydsl spring-data-mongodb

13
推荐指数
1
解决办法
901
查看次数

使用 Springdata mongo Query 删除集合中的所有文档

我想实现一个删除集合中所有文档的删除方法。我在 Spring Data 中使用 mongo db。这可以在 Mongo shell 中使用 db.myCollection.remove({}) 来完成。但是我想在我的数据访问层中编写一个方法来做到这一点。我没有在我的 Dao 类中使用 MongodbTemplate。我想知道如何使用 Query 执行此操作。

Query query = new Query();
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我该怎么做。

mongodb spring-data-mongodb

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

如何使用Spring Data MongoDB通过GridFS ObjectId获取二进制流

我无法弄清楚如何使用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)

但没有明显的路怎么走一个InputStreamGridFSFile.

只有GridFSResource让我获得corresonding的保持InputStreamInputStreamResource#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 …

mongodb spring-data spring-data-mongodb

13
推荐指数
2
解决办法
5597
查看次数

Spring Data MongoDB是否支持枚举?

对于Java枚举类型,我了解到MongoDB有两种解决方案:序列化使用Jackson的ObjectMapper.MongoRepository可以使用这些方法中的任何一种使用枚举数据类型,或者我必须编写自定义存储库吗?

spring-data spring-data-mongodb

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

使用Java访问MongoDB时连接到服务器localhost:27017时监视器线程中的异常

在为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

这可能是一些 …

java remote-host mongodb spring-data spring-data-mongodb

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