首页 > 解决方案 > 在 Mongoose 上显示带有参数的对象列表

问题描述

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

{
    "_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
        },
        {
    ...

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

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

有人有什么想法吗?

标签: mongodbmongoose

解决方案


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

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

这里的例子。

使用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

推荐阅读