Mongoose/MongoDB:在Child数组中将三个字段加在一起
Mongoose/MongoDB: Add Three Fields Together in Child Array
我目前正在尝试创建一个临时字段,将三个字段加在一起,然后根据用户输入的值进行查询(他们只看到计算结果并需要它匹配)
我最大的问题是让投影按我的需要工作。我的字段布局如下所示:
{
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
我需要能够在 rateInfo 中添加所有三个字段,并将它们显示在每个项目数组中,如下所示:
{
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
rateTotal: 175,
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
rateTotal: 235,
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
rateTotal: 30,
},
],
}
我尝试了以下代码片段,但似乎都不适合我:
$reduce 方法对 items 数组中的所有内容求和,然后将总数放在订单级别,如下所示:
{
rateTotal: 440
document: {
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
}
$unwind 方法仅将第一条记录相加,如下所示:
{
rateTotal: 175
document: {
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
}
如果有人能清楚地说明我做错了什么以及如何改正,将不胜感激。
注意:猫鼬虚拟是不可能的,因为我需要查询它。我无法回填 mongoose 模式中的计算字段(使用自定义 setter 或预保存)。
您可以使用 $map
映射到您想要的结构。
db.collection.aggregate([
{
"$addFields": {
"items": {
"$map": {
"input": "$items",
"as": "i",
"in": {
_id: "$$i._id",
rateInfo: {
baseRate: "$$i.rateInfo.baseRate",
tolls: "$$i.rateInfo.tolls",
fees: "$$i.rateInfo.fees"
},
rateTotal: {
"$add": [
"$$i.rateInfo.baseRate",
"$$i.rateInfo.tolls",
"$$i.rateInfo.fees"
]
}
}
}
}
}
}
])
这里是Mongo playground供您参考。
对于您的试验,您已经找到了 $reduce
试验的原因。
对于您的 $unwind
试验,结果实际上是正确的。只是数组被数组“压扁”了。您实际上应该能够看到多个文档,因为它们对应于每个数组条目。由于您只是查看第一个文档,所以您正在查看第一个数组元素的结果。
我目前正在尝试创建一个临时字段,将三个字段加在一起,然后根据用户输入的值进行查询(他们只看到计算结果并需要它匹配)
我最大的问题是让投影按我的需要工作。我的字段布局如下所示:
{
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
我需要能够在 rateInfo 中添加所有三个字段,并将它们显示在每个项目数组中,如下所示:
{
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
rateTotal: 175,
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
rateTotal: 235,
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
rateTotal: 30,
},
],
}
我尝试了以下代码片段,但似乎都不适合我:
$reduce 方法对 items 数组中的所有内容求和,然后将总数放在订单级别,如下所示:
{
rateTotal: 440
document: {
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
}
$unwind 方法仅将第一条记录相加,如下所示:
{
rateTotal: 175
document: {
_id: ObjectId(),
userId: "",
orderNumber: "",
items: [
{
_id: ObjectId(),
rateInfo: {
baseRate: 100,
tolls: 50,
fees: 25,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 200,
tolls: 25,
fees: 10,
},
},
{
_id: ObjectId(),
rateInfo: {
baseRate: 25,
tolls: 5,
fees: 0,
},
},
],
}
}
如果有人能清楚地说明我做错了什么以及如何改正,将不胜感激。
注意:猫鼬虚拟是不可能的,因为我需要查询它。我无法回填 mongoose 模式中的计算字段(使用自定义 setter 或预保存)。
您可以使用 $map
映射到您想要的结构。
db.collection.aggregate([
{
"$addFields": {
"items": {
"$map": {
"input": "$items",
"as": "i",
"in": {
_id: "$$i._id",
rateInfo: {
baseRate: "$$i.rateInfo.baseRate",
tolls: "$$i.rateInfo.tolls",
fees: "$$i.rateInfo.fees"
},
rateTotal: {
"$add": [
"$$i.rateInfo.baseRate",
"$$i.rateInfo.tolls",
"$$i.rateInfo.fees"
]
}
}
}
}
}
}
])
这里是Mongo playground供您参考。
对于您的试验,您已经找到了 $reduce
试验的原因。
对于您的 $unwind
试验,结果实际上是正确的。只是数组被数组“压扁”了。您实际上应该能够看到多个文档,因为它们对应于每个数组条目。由于您只是查看第一个文档,所以您正在查看第一个数组元素的结果。