gpt4 book ai didi

java - 使用 Jongo 使用 MongoDB 从 Person 集合中展开 $unwind 地址

转载 作者:行者123 更新时间:2023-12-02 06:33:37 31 4
gpt4 key购买 nike

您好,我在使用 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;
}

我的 Collection :

> 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()大于零...但打印 null)。 print() 方法经过测试并且有效。

我想获取两个 Bob 的地址,但是查询返回空对象。我错过了什么吗?我应该以不同的方式使用$unwind吗?请推荐

最佳答案

聚合框架返回与进入的格式完全相同的格式 - 展开后唯一的区别是 addresses 下嵌入了多少地址。 field 。在您的情况下,您会得到两个文件:

{ "_id": 1,
"name" : "Bob",
"age" : 34,
"addresses" : { "houseNumber" : "12",
"road" : "High Street",
"town" : "Small Town",
"postalCode" : "BC2 3DE"
}
}

这并不能非常有效地转换为 Address 类,因为如您所见,Address 对象的值是 addresses字段,而不是顶级对象。

不清楚的是为什么您需要聚合 - 您正在获取一个人的地址列表。当你做一个简单的 find()在 Id 的人上,字段“地址”已经是 ListAddress对象。

在 MongoDB 中 find() has the option to return just selected fields ,或排除命名字段(类似于 SQL 的 SELECT * 不如 SELECT col1,col2 高效),因此如果您这样做 the Java equivalent of db.persons.find({filter-condition}, {"_id":0, "addresses":1})您将返回一份仅包含地址列表的文档。

关于java - 使用 Jongo 使用 MongoDB 从 Person 集合中展开 $unwind 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867629/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com