我正在使用findOne查询数据库,它将只返回一个文档。现在,我希望在一个对象中包含该文档的几个字段,在另一个对象中包含其他字段,这两个字段都 Package 在一个对象中。例如,我有一个名为Bus的表,其中包含以下字段-
_id,
busNo,
city,
agency,
date,
ticketPrice,
helper,
driver,
totalCollection
我的Find One查询返回一个文档,但我希望它采用以下格式-
existingAggr - {
"result": [
{
"_id": "630dcd0c652489bca1b319f7",
"busNo": "123",
"city": "32",
"agency": "58",
"date": "2022-08-29T00:00:00.000Z",
}
],
"aggregates": {
"ticketPrice": 8,
"totalCollection": 402,
"helper": 0,
"driver": 23,
}
}
我希望这要么是单一的数据库访问,要么我们可以做一些Java计算,以这种方式进一步带来我的结果,但我似乎无法达成解决方案。目前,我正在使用以下代码-
const res = await Bus.findOne(
{ busNo, date },
{
_id :1,
busNo:1,
city:1,
agency:1,
date:1,
ticketPrice:1,
helper:1,
driver:1,
totalCollection:1
}
);
这将在一个字段中返回所有字段。
2条答案
按热度按时间798qvoo81#
给定结果后,您可以直接根据结果创建新对象。
更高级的答案
您可以拥有一个仅从词典中检索特定关键字函数
所以在你的情况下
3pmvbmvn2#
这应该与投影非常简单,投影是改变文档形状的行为。
您编辑的问题现在包括对最简单投影类型的引用,但不包括there are many more。在您的情况下,看起来您仍然可以使用相对简单的一个,试试这个:
Playground demonstration here.
如果每次检索数据时都要这样做,那么您可能希望更改文档的模式,因为它们存储在数据库中。或者,您可以使用create a view来定义该投影,然后在每次查询数据时自动应用该投影,而不必依赖于客户端来请求数据。