使用 Spring 数据 Mongo 从 MongoDB 获取数组元素
Get array element from MongoDB using Spring Data Mongo
我想使用 Spring 数据 Mongo.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 中获取 return 数组或如何解包以在 Java 中进行反序列化?
嗯,它总是 return 文档,而不仅仅是文档的一部分,当您包含字段 "todo" 时,您只需确保该字段是 returned 并且其他人不是,但它仍然是将 returned 的文档,其中将包含值 "todos".
如果您传递 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;
}
我想使用 Spring 数据 Mongo.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 中获取 return 数组或如何解包以在 Java 中进行反序列化?
嗯,它总是 return 文档,而不仅仅是文档的一部分,当您包含字段 "todo" 时,您只需确保该字段是 returned 并且其他人不是,但它仍然是将 returned 的文档,其中将包含值 "todos".
如果您传递 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;
}