当您希望一个对象中只有几个字段而另一个对象中有其他字段时,如何使用findOne()?

ztyzrc3y  于 2022-10-22  发布在  其他
关注(0)|答案(2)|浏览(133)

我正在使用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
   }
  );

这将在一个字段中返回所有字段。

798qvoo8

798qvoo81#

给定结果后,您可以直接根据结果创建新对象。

const res = await BusDayWise.findOne(
    { ...filter },
    { session: mongoSession }
  );

const result = [
    {
      "_id": res._id,
      "busNo": res.busNo,
      "city": res.city,
      "agency": res/agency,
      "date": res.date,
    }
],
const aggregates = 
{
    "ticketPrice": res.ticketPrice,
    "totalCollection": res.totalCollection,
    "helper": res.helper,
    "driver": res.driver,
}

更高级的答案

您可以拥有一个仅从词典中检索特定关键字函数

function subDict(dict, keys){
   const newDict = {};
   keys.forEach(key => newDict[key] = dict[key]);
   return newDict 
}

test = {"a": 1, "b": 2, "c": 3}
keys = ["a", "c"];
newTest = subDict(test, keys); // {"a": 1; "c": 3}

所以在你的情况下

const result = subDict(res, ["_id", "busNo", "city","agency", "date"]);
const aggregates = subDict(res, ["ticketPrice", "totalCollection", "helper", "driver"]);
3pmvbmvn

3pmvbmvn2#

这应该与投影非常简单,投影是改变文档形状的行为。
您编辑的问题现在包括对最简单投影类型的引用,但不包括there are many more。在您的情况下,看起来您仍然可以使用相对简单的一个,试试这个:

{
  "result._id": "$_id",
  "result.busNo": "$busNo",
  "result.city": "$city",
  "result.agency": "$agency",
  "result.date": "$date",
  "aggregates.ticketPrice": "$ticketPrice",
  "aggregates.totalCollection": "$totalCollection",
  "aggregates.helper": "$helper",
  "aggregates.driver": "$driver",
  _id: 0
}

Playground demonstration here.
如果每次检索数据时都要这样做,那么您可能希望更改文档的模式,因为它们存储在数据库中。或者,您可以使用create a view来定义该投影,然后在每次查询数据时自动应用该投影,而不必依赖于客户端来请求数据。

相关问题