MongoDb:根据属性值从对象数组中获取元素

时间:2020-10-15 19:15:36

标签: javascript node.js mongodb mongodb-query

Working Playground

有两个集合:

1。文件:

    [{
    
      "_id": {
        "$oid": "5f44b6e334f74d606053003d"
      },
      "documentId": 9,
      "name": "Project Charter 9",
      "type": "Charter",
      "status": {
        "id": 2,
        "name": "Submitted"
      }....  
      ]
    }]

2。状态主题

[{"_id":{"$oid":"5f8481b2bd39674a909a9c53"},"id":0,"color":"Black"}]

我想获取每种状态的颜色。

所需的输出:

{
  "totalDocCount": [
    {
      "_id": {
        "Status": {
          "_id": 0,
          "name": "Total Documents",
          "Color": "Black"
        }
      },
      "count": 10
    }
  ],
  "countByStatus": [
    {
      "_id": {
        "Status": {
          "id": 1,
          "name": "Draft"
        },
        "Color": "Grey"
      },
      "count": 1
    },
    {
      "_id": {
        "Status": {
          "id": 2,
          "name": "Submitted"
        },
        "Color": "Blue"
      },
      "count": 6
    },
    {
      "_id": {
        "Status": {
          "id": 3,
          "name": "Approved"
        },
        "Color": "Green"
      },
      "count": 2
    },
    {
      "_id": {
        "Status": {
          "id": 4,
          "name": "Rejected"
        },
        "Color": "Red"
      },
      "count": 1
    }
  ]
}

我想出了一个可行的解决方案。但这是一个糟糕的糟糕解决方案。

db.Documents.aggregate([
  {
    "$lookup": {
      from: "StatusTheme",
      localField: "id",
      foreignField: "status.id",
      as: "statusColorMapping"
    }
  },
  {
    "$facet": {
      "totalDocCount": [
        {
          "$group": {
            "_id": {
              "Status": {
                "_id": 0,
                "name": "Total Documents",
                "Color": {
                  "$arrayElemAt": [
                    "$statusColorMapping.color",
                    0
                  ]
                }
              }
            },
            "count": {
              "$sum": 1
            }
          }
        }
      ],
      "countByStatus": [
        {
          "$group": {
            "_id": {
              "Status": "$status",
              "Color": {
                "$arrayElemAt": [
                  "$statusColorMapping.color",
                  "$status.id"
                ]
              }
            },
            "count": {
              "$sum": 1
            },
            
          }
        },
        {
          $sort: {
            _id: 1
          }
        }
      ]
    }
  }
])

如您所见,我利用了状态ID从0开始的事实。我是"$arrayElemAt",从查询变量statusColorMapping中获取第n个项目。

这里真正的解决方案是什么?

如果可能的话。我想尽可能避免任何变量。 (我有原因) 另外,我想在本地进行。而且以后不会通过JavaScript。

0 个答案:

没有答案