我有一个mongo集合,它有一个ObjectId的嵌入式数组,所以一般格式如下:
{
"_id" : ObjectId("123abc..."),
"Active" : [
{
"Id" : ObjectId("123abc...")
},
{
"Id" : ObjectId("123abc...")
},
...,
{
"Id" : ObjectId("123abc...")
}
],
"field1" : "blah blah",
"field2" : "blah blah",
"field3" : "blah blah",
"field4" : "blah blah"
"field5" : ObjectId("123abc...")
}
我的Java类非常简单:
@Document(collection="MyCollection")
public class MyCollection {
@Id
private ObjectId id;
private String field1;
...
private ObjectId field5;
@Field("Active")
private List<Active> active;
// Getters & Setters here
public static class Active {
@Field("Id")
private ObjectId id;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
}
}
当我进行查询时,所有内容都会正确显示,但是&#34; Active&#34;领域。如果该数组中有18个条目,我将得到一个大小为18的List,但是Active.class的18个条目都是null - 所以它得到它的列表,它只是永远不会超过其中的ObjectId值有源阵列。
我使用Spring和Spring mongo驱动程序。
编辑:如果我使用mongo-java-driver并以这种方式查询:
DB database = mongoClient.getDB("myDB");
DBCollection collection = database.getCollection("MyCollection");
DBObject query = new BasicDBObject("_id", new ObjectId("123abc..."));
DBCursor cursor = collection.find(query);
DBObject jo = cursor.one();
它有效,我得到了我正在寻找的整个文档 - 所以我假设有一种方法可以用Spring方式做到这一点吗?
答案 0 :(得分:0)
在我的pom.xml中使用这些版本之前:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.6.1.RELEASE</version>
</dependency>
通过更新为每个版本更新的版本:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
我能够解决这个问题。所以现在当我查询时:
return Arrays.asList(mongoTemplate.findById(new ObjectId("123abc..."), Foo.class));
ObjectId的数组完好无损(之前我会得到一个正确大小的数组 - 所以它知道有18个 - 但它是一个空数组。
答案 1 :(得分:0)
为什么不在MyCollection类中使用注释@Id?
public static class Active {
@Id
private ObjectId id;
}