Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用mongoose检索不同的聚合字段_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Node.js 使用mongoose检索不同的聚合字段

Node.js 使用mongoose检索不同的聚合字段,node.js,mongodb,mongoose,aggregation-framework,Node.js,Mongodb,Mongoose,Aggregation Framework,我正试图用mongoose在节点JS上进行查询。这是我的数据集: {"_id":{"$oid":"5e49c389e3c23a1da881c1c9"},"name":"New York","good_incidents":{"$numberInt":"50"},"salary":{"$numberInt":"50000"},"bad_incidents":"30"} {"_id":{"$oid":"5e49c3bbe3c23a1da881c1ca"},"name":"Cairo","bad_in

我正试图用mongoose在节点JS上进行查询。这是我的数据集:

{"_id":{"$oid":"5e49c389e3c23a1da881c1c9"},"name":"New York","good_incidents":{"$numberInt":"50"},"salary":{"$numberInt":"50000"},"bad_incidents":"30"}
{"_id":{"$oid":"5e49c3bbe3c23a1da881c1ca"},"name":"Cairo","bad_incidents":{"$numberInt":"59"},"salary":{"$numberInt":"15000"}}
{"_id":{"$oid":"5e49c42de3c23a1da881c1cb"},"name":"Berlin","incidents":{"$numberInt":"30"},"bad_incidents":"15","salary":{"$numberInt":"55000"}}
{"_id":{"$oid":"5e49c58ee3c23a1da881c1cc"},"name":"New York","good_incidents":{"$numberInt":"15"},"salary":{"$numberInt":"56500"}}
我想做的是得到这些值:

  • 收藏中重复次数最多的城市
  • 不良事件的平均值
  • 良好事件的最大价值
  • 无不良事件的最高工资
  • 我试图在一个查询中解决这个问题,因为每个字段只需要一个值。如果有人能引导我走上正确的道路,我会很高兴的。不需要完整的解决方案

    问候

    您可以使用运算符执行,该运算符允许同时计算多个聚合

    db.collection.aggregate([
      {
        $facet: {
          repeated_city: [
            {
              $group: {
                _id: "$name",
                name: {
                  $first: "$name"
                },
                count: {
                  $sum: 1
                }
              }
            },
            {
              $match: {
                count: {
                  $gt: 1
                }
              }
            },
            {
              $sort: {
                count: -1
              }
            },
            {
              $limit: 1
            }
          ],
          bad_incidents: [
            {
              $group: {
                _id: null,
                avg_bad_incidents: {
                  $avg: {
                    $toInt: "$bad_incidents"
                  }
                }
              }
            }
          ],
          good_incidents: [
            {
              $group: {
                _id: null,
                max_good_incidents: {
                  $max: {
                    $toInt: "$good_incidents"
                  }
                }
              }
            }
          ],
          max_salary: [
            {
              $match: {
                bad_incidents: {
                  $exists: false
                }
              }
            },
            {
              $group: {
                _id: null,
                max_salary: {
                  $max: {
                    $toInt: "$salary"
                  }
                }
              }
            }
          ]
        }
      },
      {
        $replaceWith: {
          $mergeObjects: [
            {
              $arrayElemAt: [
                "$repeated_city",
                0
              ]
            },
            {
              $arrayElemAt: [
                "$bad_incidents",
                0
              ]
            },
            {
              $arrayElemAt: [
                "$good_incidents",
                0
              ]
            },
            {
              $arrayElemAt: [
                "$max_salary",
                0
              ]
            }
          ]
        }
      }
    ])
    


    [
      {
        "_id": null,
        "avg_bad_incidents": 34.666666666666664,
        "count": 2,
        "max_good_incidents": 50,
        "max_salary": 56500,
        "name": "New York"
      }
    ]