Как извлечь весь внедренный документ из нескольких документов Mongo, используя Spring Data Mongo - PullRequest
0 голосов
/ 04 апреля 2019

Я использую Spring Data Mongo и у меня почти 10 000 документов в mongoDB. Я использую Spring Boot + Spring Data Mongo пример.

У меня есть следующие документы, и каждый документ имеет свой уникальный и общий адрес:

{
  "_id" : ObjectId("592c7029aafef820f432c5f3"),
  "_class" : "lankydan.tutorial.mongodb.documents.Person",
  "firstName" : "John",
  "secondName" : "Doe",
  "dateOfBirth" : ISODate("2017-05-29T20:02:01.636+01:00"),
  "address" : {
    "addressLineOne" : "19 Imaginary Road",
    "addressLineTwo" : "Imaginary Place",
    "city" : "Imaginary City",
    "country" : "US"
  },
  "profession" : "Winner",
  "salary" : 100,
  "hobbies" : [ 
    {
      "name" : "Badminton"
    }, 
    {
      "name" : "TV"
    }
  ]
} 

С тех пор address встроено в коллекцию User. Как получить все уникальные адреса или все адреса? Я хочу написать сервис для этого.

Нужно ли создавать для этого индексацию?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Это может быть просто достигнуто в последней версии Spring Boot Starter Parent 2.1.4.RELEASE согласно Spring Data Mongo Docs

List<Object> object = mongoTemplate.query(User.class).distinct("address").all();
for (Object object2 : object) {
    Address address = (address) object2;
    System.out.println(address);
}
0 голосов
/ 04 апреля 2019

Вы должны создать класс POJO с именем Address, в котором вы должны определить его поля следующим образом:

 public class Address {

 private String addressLineOne;
 private String addressLineTwo;
 private String city;
 private String country;

// getters and setters

}

Затем вы должны изменить свой класс User.java:

public class User {

private String id;
// other fields    
private Address address;
// other fields

}

Джексон Либери из Spring автоматически связывает эти поля с вашим POJO.

Теперь, когда вы попытаетесь получить поля вашего адреса, вы получите это с помощью:

System.out.println(user.getAddress.getAddressLineOne);
System.out.println(user.getAddress.getCity);
...