0

Я хочу получить массив из MongoDB с использованием Spring Data Mongo.Получить массив из MongoDB с использованием Spring Data Mongo

У меня есть коллекция состоит из пользователей с несделанным:

{ 
    "_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. Ответ в Монго кли, как:

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

Как вернуть массив из MongoDB или как разворачивать его для десериализации в Java?

+0

Какую ошибку вы получаете? Просто fyi '_id' в запросе отличается от того, что показано в образце. – Veeram

+0

@ SagarReddy oops, мой плохой. На самом деле я передаю параметр userId. Я исправлю вопрос. –

ответ

1

Ну, он всегда будет возвращать документ, а не только часть документа, когда вы включаете поле «todo», вы просто гарантируете, что это поле будет возвращено, а другие - нет, но все же это документ, который будет который будет содержать значение «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; 
} 
+0

Да, я пробовал сначала обходное решение. Как насчет выполнения такого запроса? –

+1

Насколько я вижу, он действительно оптимизирован, посмотрите на факты, вы запрашиваете против _id, который является первичным ключом, который уже проиндексирован, вы включаете только полевые тодосы, я понимаю, что у него может быть много данных, но все же это так же быстро, как и получается. –

+0

Спасибо. Счастливое кодирование :) –