こんにちは、Jongo を使用して、$unwind
オペレーターを使用して個人のコレクションからアドレスのリストを取得する際に問題が発生しています。
ご覧のとおり、Person クラスを次のように定義しました。
public class Person {
@Id
private long personId;
private String name;
private int age;
private List<Address> addresses;
//getters and setters
Address クラスは次のように定義されます。
public class Address {
private String houseNumber;
private String road;
private String town;
private String postalCode;
//gettes and setters
クエリは非常に単純です。
public List<Address> getAddressByPersonId(long id) {
List<Address> list = persons.aggregate("{$project:{addresses:1}}")
.and("{$match:{_id:#}}",id)
.and("{$unwind: '$addresses'}")
.as(Address.class);
return list;
}
私のコレクション:
> db.persons.find()
{ "name" : "Bob", "age" : 34, "addresses" : [ { "houseNumber" : "12",
"road" : "High Street", "town" : "Small Town", "postalCode" : "BC2 3DE"
}, { "houseNumber" : "12", "road" : "High Street", "town" :
"Small Town", "postalCode" : "BC2 3DE" } ], "_id" : NumberLong(1) }
>
これにもJUnitテストがあります:
@Before
public void setUp(){
service = new PersonServiceImpl();
//store a person into the database (manually) before the tests
MongoCollection persons = Database.getInstance().getCollection(CollectionNames.PERSONS);
//create a new person
Person p = new Person();
p.setPersonId(1L);
p.setName("Bob");
p.setAge(34);
//create two addresses for this person
Address a = new Address();
a.setHouseNumber("33");
a.setRoad("Fake Road");
a.setPostalCode("AB1 2CD");
a.setTown("Big Town");
p.addAddress(a);
a.setHouseNumber("12");
a.setRoad("High Street");
a.setPostalCode("BC2 3DE");
a.setTown("Small Town");
p.addAddress(a);
persons.save(p);
}
@After
public void tearDown(){
service = null;
}
@Test
public void getAddressesByPersonIdTest(){
List<Address> list = service.getAddressByPersonId(1L);
for (Address item : list){
item.print();
}
Assert.assertTrue(list.size() > 0);
}
}
どの出力
### Address: null null, null, null
### Address: null null, null, null
何が問題なのかよくわかりません。どうやらテストは失敗しません(つまりlist.size()
、0 より大きくなりますが、null を出力します)。print()
メソッドがテストされ、機能します。
ボブの 2 つのアドレスを取得したいのですが、クエリは null オブジェクトを返します。何か不足していますか?$unwindを別の方法で使用する必要がありますか? 提案してください