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
    检查条件
    name
    是否为hr,然后使用
    $concat
    返回当前
    name
    ,并将值除以
    $divide
  • $project
    doc
    对象移动到根目录


第二个选项不带查找

  • $facet
    将两个结果分开
  • $map
    迭代
    结果
    数组的循环,检查
    名称是否为hr
    ,然后concat
    名称
    并除以
    ,否则返回相同的值
  • $unwind
    解构
    结果
    数组
  • $project
    显示字段

  • $lookup
    使用相同的集合并匹配
    名称:hr
    并返回单个结果
  • $unwind
    解构
    hr
    数组
  • $project
    检查条件
    name
    是否为hr,然后使用
    $concat
    返回当前
    name
    ,并将值除以
    $divide
  • $project
    doc
    对象移动到根目录


第二个选项不带查找

  • $facet
    将两个结果分开
  • $map
    迭代
    结果
    数组的循环,检查
    名称是否为hr
    ,然后concat
    名称
    并除以
    ,否则返回相同的值
  • $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"
    }
  }
])