【问题标题】:Display object list with a parameter on Mongoose在 Mongoose 上显示带有参数的对象列表
【发布时间】:2020-11-22 07:16:48
【问题描述】:

我有一个查找查询,它返回一个对象列表:

{
    "_id": "5fb94fda487b9348c4291450",
    "name": [
        {
            "NewConfirmed": 642686,
            "TotalConfirmed": 49315431,
            "NewDeaths": 9555,
            "TotalDeaths": 1242785,
            "NewRecovered": 288131,
            "TotalRecovered": 32473892
        },
        {
            "NewConfirmed": 116262,
            "TotalConfirmed": 6014461,
            "NewDeaths": 4640,
            "TotalDeaths": 371913,
            "NewRecovered": 77575,
            "TotalRecovered": 2492884
        },
        {
    ...

这一切都很好,但我正在尝试使用值为 NewConfirmedTotalConfirmedNewDeaths 的状态参数进行新查询,以仅显示该特定字段。所以端点看起来像/something/status/:status

我已经尝试过使用过滤器和简单的查找进行聚合,但仍然一无所获。

有人知道吗?

【问题讨论】:

  • 你的预期输出是什么?
  • 例如,根据我传递的字符串值“NewConfirmed、NewDeath 等”,选择具有多个值的选择,我得到相应的特定值
  • 您想将包含所有子文档的对象返回到数组中,但只能返回参数指定的字段?
  • 通俗易懂:我的端点是土豆/${status} Status = "NewConfirmed" return "NewConfirmed": 642686,
  • 所以你只希望数组中的第一个值。如果你不指定它,那根本不容易。

标签: mongodb mongoose


【解决方案1】:

首先,您需要一个具有这种结构的查询:

db.collection.aggregate([
  {
    /**Your match object*/
  },
  {
    "$project": {
      "YourStatus": {
        "$first": "$name.YourStatus"
      }
    }
  }
])

例如here

使用mongoose需要这样创建对象查询:

var query = {}
query[status] = {"$first": "$name."+status}

然后执行mongoose 查询,将对象替换为query 对象。

var aggregate = await model.aggregate([
  {
    //Your $match stage here
  },
  {
    "$project": query
  }
])

另外,我已经在本地进行了测试,但我的 mongo 版本(我认为)无法识别 $first,所以我使用了 $arrayElemAt。根据mongo docs$first 相同。

var status = "NewConfirmed"
var query = {}
query[status] = { $arrayElemAt: ["$name."+status, 0]} 

您也可以将_id: 0 添加到$project 聚合中以不返回此字段。

var query = {_id:0} //Here add _id: 0 to project object
query[status] = { $arrayElemAt: ["$name."+status, 0]}  //And the rest of the stage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2010-10-10
    • 2013-02-05
    • 1970-01-01
    • 2013-03-09
    • 2018-10-20
    相关资源
    最近更新 更多