使用MongoDB中的聚合管道将计算字段添加到数组字段中的文档

时间:2021-03-24 09:44:22

标签: mongodb aggregation-framework

我正在尝试向数组中的文档添加一个表示相对权重的字段。我在此处显示了以下数据模型,其中包含两个文档:

db.pos.insertMany([
  {"asof": "2020-02-05",
  "holdings": [
    {"fid": 1,"shares": 50},
    {"fid": 2,"shares": 50}
  ],
  "portfolio_id": 10,
  "user": "xxx"
  },
  {"asof": "2020-02-02",
  "holdings": [
    {"fid": 1,"shares": 40},
    {"fid": 2,"shares": 60},
    {"fid": 3,"shares": 30}
  ],
  "portfolio_id": 10,
  "user": "xxx"
  }]);

现在,对于数组字段“持有”中的每个文档,我正在尝试添加“wt”,它只是共享/总和(共享),其中总和用于持有内的所有文档。 我的目标是返回带有“wt”加法的整个文档,因此最终结果将如下所示:

{ "_id": ObjectId()
  "asof": "2020-02-05",
  "holdings": [
    {"fid": 1,"shares": 50, "wt": 0.5},
    {"fid": 2,"shares": 50, "wt": 0.5}
  ],
  "portfolio_id": 10,
  "user": "xxx"
  },

  {"_id": ObjectId()
  "asof": "2020-02-02",
  "holdings": [
    {"fid": 1,"shares": 40, "wt": 0.3076923},
    {"fid": 2,"shares": 60, "wt": 0.4615384},
    {"fid": 3,"shares": 30, "wt": 0.2307692}
  ],
  "portfolio_id": 10,
  "user": "xxx"
  }

我尝试过使用 $addField 或 $project 以及 $map($divide 和 $sum)的路由/阶段,有些比其他的更接近预期的结果。但是,我离获得如上所示的“就地”结果还差得很远。有谁能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

db.pos.aggregate([
    {
        $addFields: {
            "holdings": {
                $map: {
                    input: "$holdings",
                    as: "item",
                    in: {
                        fid: "$$item.fid",
                        shares: "$$item.shares",
                        wt: { $divide: ["$$item.shares", { $sum: "$holdings.shares" }] }
                    }
                }
            }
        }
    }
])

输出:

/* 1 createdAt:3/24/2021, 5:00:41 PM*/
{
    "_id" : ObjectId("605b22e149e1013fd8c32337"),
    "asof" : "2020-02-05",
    "holdings" : [
        {
            "fid" : 1,
            "shares" : 50,
            "wt" : 0.5
        },
        {
            "fid" : 2,
            "shares" : 50,
            "wt" : 0.5
        }
    ],
    "portfolio_id" : 10,
    "user" : "xxx"
},

/* 2 createdAt:3/24/2021, 5:00:41 PM*/
{
    "_id" : ObjectId("605b22e149e1013fd8c32338"),
    "asof" : "2020-02-02",
    "holdings" : [
        {
            "fid" : 1,
            "shares" : 40,
            "wt" : 0.3076923076923077
        },
        {
            "fid" : 2,
            "shares" : 60,
            "wt" : 0.46153846153846156
        },
        {
            "fid" : 3,
            "shares" : 30,
            "wt" : 0.23076923076923078
        }
    ],
    "portfolio_id" : 10,
    "user" : "xxx"
}
相关问题