Arrays 如何将文档值划分为相同的文档,但在MongoDB中除数的键名是相同的
解释:要将Arrays 如何将文档值划分为相同的文档,但在MongoDB中除数的键名是相同的,arrays,mongodb,mongoose,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,解释:要将名称:Alex,名称:petr值除以名称:hr值 name:Alex,name:petr和name:hr是我的参数名称 还希望在输出文档中查看name:hr的值 [ { "name": "Alex", "value": 65 }, { "name": "petr", "value": 8 }, { "
名称:Alex
,名称:petr
值
除以名称:hr
值
name:Alex
,name:petr
和name:hr
是我的参数名称
还希望在输出文档中查看name:hr
的值
[
{
"name": "Alex",
"value": 65
},
{
"name": "petr",
"value": 8
},
{
"name": "hr",
"value": 20
}
]
预期产出:
[
{
"name": "Alex/hr",
"value": 3.25
},
{
"name": "petr/hr",
"value": 0.4
},
{
"name": "hr",
"value": 20
}
]
演示-
使用
演示-
使用
使用相同的集合并匹配$lookup
并返回单个结果名称:hr
解构$unwind
数组hr
检查条件$project
是否为hr,然后使用name
返回当前$concat
和name
,并将值除以值
$divide
将$project
对象移动到根目录doc
第二个选项不带查找
将两个结果分开$facet
迭代$map
数组的循环,检查结果
,然后concat名称是否为hr
并除以名称
,否则返回相同的值值
解构$unwind
数组结果
显示字段$project
使用相同的集合并匹配$lookup
并返回单个结果名称:hr
解构$unwind
数组hr
检查条件$project
是否为hr,然后使用name
返回当前$concat
和name
,并将值除以值
$divide
将$project
对象移动到根目录doc
第二个选项不带查找
将两个结果分开$facet
迭代$map
数组的循环,检查结果
,然后concat名称是否为hr
并除以名称
,否则返回相同的值值
解构$unwind
数组结果
显示字段$project
没有查找的解决方案很好。@turivishal感谢兄弟,您在查找方面做了出色的工作。@TusharGupta curioustushar感谢您的查询,它看起来不错,但我收到了以下错误消息:“命令失败,错误2(BadValue):'服务器上$facet阶段的子管道不能为空”。@bc110402922尝试
所有值:[{$match:{}]
谢谢!它现在可以工作了,但只是一件小事,在我重新思考我的问题之后,我不需要输出文档中的name:hr
的值。我应该从查询中删除哪一行?没有查找的解决方案很好。@turivishal感谢兄弟,您在查找方面做了出色的工作。@TusharGupta curioustushar感谢查询,它看起来很好,但我收到了以下错误消息“命令失败,错误2(BadValue):“服务器上$facet阶段中的子管道不能为空”@bc110402922请尝试所有值:[{$match:{}]
谢谢!它现在可以工作了,但只是一件小事,在我重新思考我的问题之后,我不需要输出文档中的name:hr
的值。我应该从查询中删除哪一行?感谢您的回答,集合中的值
不可用值
也在同一个查询中计算,我不可能进行查找,我们可以不进行查找吗?您知道我如何完成此操作吗?感谢您的回答,集合中没有值
也在同一查询中计算值
,查找对我来说是不可能的,我们可以不进行查找吗?您知道我如何才能做到这一点吗?
db.collection.aggregate([
{
$facet: {
hrVal: [
{ $match: { name: "hr" } }, // filter
{ $project: { _id: 0, value: 1 } } // take only value
],
allValues: [] // all documents or you can add match pipeline to filter here
}
},
{ $unwind: "$hrVal" }, // break into individual documents - now every document will have hrVal.value
{ $unwind: "$allValues" }, // break into individual documents
{
$set: { //
"allValues": {
"$cond": [
{ $eq: [ "$allValues.name", "hr" ] }, // condition
"$allValues", // true
{ // false
_id: "$allValues._id",
name: { "$concat": [ "$allValues.name", "/hr" ] }, // set name
value: { "$divide": [ "$allValues.value", "$hrVal.value" ] } // divide by hr value
}
]
}
}
},
{ $replaceRoot: { "newRoot": "$allValues" } } // reset to orignal document shape
])
db.collection.aggregate([
{
$lookup: {
from: "collection",
pipeline: [
{ $match: { name: "hr" } },
{ $limit: 1 }
],
as: "hr"
}
},
{ $unwind: "$hr" },
{
$project: {
doc: {
$cond: [
{ $eq: ["$name", "hr"] },
{
name: "$name",
value: "$value"
},
{
name: { $concat: ["$name","/","$hr.name"] },
value: { $divide: ["$value", "$hr.value"] }
}
]
}
}
},
{
$project: {
name: "$doc.name",
value: "$doc.value"
}
}
])
db.collection.aggregate([
{
$facet: {
result: [{ $match: {} }],
hr: [{ $match: { name: "hr" } }]
}
},
{
$project: {
result: {
$map: {
input: "$result",
in: {
$cond: [
{ $eq: ["$$this.name", "hr"] },
"$$this",
{
name: { $concat: ["$$this.name", "/", { $first: "$hr.name" }] },
value: { $divide: ["$$this.value", { $first: "$hr.value" }] }
}
]
}
}
}
}
},
{ $unwind: "$result" },
{
$project: {
name: "$result.name",
value: "$result.value"
}
}
])