使用Spring Data Mongo从MongoDB获取数组元素

时间:2017-01-07 19:06:41

标签: java mongodb spring-data aggregation-framework spring-data-mongodb

我想使用Spring Data Mongo从MongoDB中检索一个数组。

我的收藏包含有待办事项的用户:

{
    "_id" : ObjectId("584d863e439e512f4c457eea"),
    "username" : "e",
    "todos" : [
        {
            "_id" : ObjectId("584d8654439e512f4c457eeb"),
            "title" : "Officiis id sed aut molestiae id id magni.",
            "body" : "Fugit velit rem incidunt. Et ad aliquam inventore voluptatem sed omnis voluptas. Aut sint eum voluptatem.",
            "when" : ISODate("1972-09-15T04:24:08.880Z"),
            "priority" : "HIGH",
            "status" : "DEFAULT",
            "tags" : [
                "animi",
                "veniam",
                "exercitationem"
            ]
        },
        // ...
    ]
}

我尝试了以下内容:

public List<Todo> getUserTodos(String userId)
    Query x = new Query(Criteria.where("_id").is(userId));
    x.fields().exclude("_id").include("todos");
    return mongoTemplate.find(x, Todo.class);
}

实际上,我得到一个空的ArrayList。 mongo cli的反应如下:

{
    "todos": [ {/* todo1 */}, {/* todo2 */} ]
}

如何从MongoDB返回数组或如何解包它以便在Java中进行反序列化?

1 个答案:

答案 0 :(得分:1)

当你包含字段&#34; todo&#34;它总是会返回文档,而不仅仅是文档的一部分。你只是确保,该字段被返回而其他字段不存在但仍然是将返回的文档,其中包含值&#34; todos&#34;。

如果你传递Todo.class,它会查看一个名为todo的集合,它不在那里,因此是空列表。

public List<Todo> getUserTodos(String userId)
    Query x = new Query(Criteria.where("_id").is(userId));
    x.fields().exclude("_id").include("todos");
    User user = mongoTemplate.findOne(x, User.class);
    return user.getTodos();
}

同样的事情可以用地图

完成
public List<Todo> getUserTodos(String userId)
    Query x = new Query(Criteria.where("_id").is(userId));
    x.fields().exclude("_id").include("todos");
    Map user = mongoTemplate.findOne(x, Map.class);
    if(user != null && user.containsKey("todos")){
      return (List<Todo>)user.get("todos");
    }
    return null;
}