MongoDB聚合函数

问题描述 投票:1回答:1

我在Mongo集合中有以下名为“电影”的JSON文档

{
      "_id": "5ed0c9700b9e8b0e2c542054",
      "movie_name": "Jake 123",
      "score": 20,
      "director": "Jake"
    },
    {
      "_id": "5ed0a9840b9e8b0e2c542053",
      "movie_name": "Avatar",
      "director": "James Cameroon",
      "score": 50,
      "boxoffice": [
        {
          "territory": "US",
          "gross": 2000
        },
        {
          "territory": "UK",
          "gross": 1000
        }
      ]
    },
    {
      "_id": "5ed0a9630b9e8b0e2c542052",
      "movie_name": "Titanic",
      "score": 100,
      "director": "James Cameroon",
      "boxoffice": [
        {
          "territory": "US",
          "gross": 1000
        },
        {
          "territory": "UK",
          "gross": 500
        }
      ],
      "actors": [
        "Kate Winselet",
        "Leonardo De Caprio",
        "Rajinikanth",
        "Kamalhaasan"
      ]
    }

我运行以下查询,以查找各个电影国家/地区的最大集合。我的意图是找到最大的藏书和相应的领土。

db.movies.aggregate([
    {$match: {"boxoffice" : { $exists: true, $ne : []}}},
    {$project: {
                "title":"$movie_name", "max_boxoffice": {$max : "$boxoffice.gross"}, 
                "territory" : "$boxoffice.territory" } }
          ])

我得到如下结果。如何获得与馆藏相对应的正确领土?

{
    "_id" : ObjectId("5ed0a9630b9e8b0e2c542052"),
    "title" : "Titanic",
    "max_boxoffice" : 1000,
    "territory" : [
        "US",
        "UK"
    ]
},
{
    "_id" : ObjectId("5ed0a9840b9e8b0e2c542053"),
    "title" : "Avatar",
    "max_boxoffice" : 2000,
    "territory" : [
        "US",
        "UK"
    ]
}

预期输出:

Avatar and Titanic在美国筹集了更多的钱。我希望领土显示它们的值

{
        "_id" : ObjectId("5ed0a9630b9e8b0e2c542052"),
        "title" : "Titanic",
        "max_boxoffice" : 1000,
        "territory" : "US"
    },
    {
        "_id" : ObjectId("5ed0a9840b9e8b0e2c542053"),
        "title" : "Avatar",
        "max_boxoffice" : 2000,
        "territory" : "US"

    }
mongodb
1个回答
0
投票

对于此特定要求,您可以使用$set (aggregation)$set (aggregation)将新字段追加到现有文档。并且我们可以在聚合操作中包括一个或多个$set阶段来实现这一点,例如:

$set

db.movies.aggregate([ { $match: { "boxoffice": { $exists: true, $ne: [] } } }, { $set: { boxoffice: { $filter: { input: "$boxoffice", cond: { $eq: ["$$this.gross", { $max: "$boxoffice.gross" }]} } } } }, { $set: { boxoffice: { $arrayElemAt: ["$boxoffice", 0] } } }, { $project: { "title": "$movie_name", "max_boxoffice": "$boxoffice.gross", "territory": "$boxoffice.territory" } } ])

© www.soinside.com 2019 - 2024. All rights reserved.