我正在尝试向数组中的文档添加一个表示相对权重的字段。我在此处显示了以下数据模型,其中包含两个文档:
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)的路由/阶段,有些比其他的更接近预期的结果。但是,我离获得如上所示的“就地”结果还差得很远。有谁能帮帮我吗?
答案 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"
}