从结果中移除MongoDB的外部括号

huangapple go评论129阅读模式
英文:

MongoDB remove outer brackets from result

问题

不确定为什么我无法实现这个... 我只想返回结果,不要外部括号,之前我做过,但是最后阶段的分组方式会导致与 $mergeObjects(错误:输入是数组)和 $concatArrays(输入是对象)一起使用时出现错误。

管道:

User.aggregate([
    {
      $match: {
        _id: userId
      }
    },
    {
      $lookup: {
        from: 'clients',
        localField: "clients",
        foreignField: "_id",
        as: "Clients",
        pipeline: [
          {
            $project: {
              _id: 1,
              fullName: "$fullName",
              contracts: {$last: "$contracts"}
            }
          },
          {
            $project: {
              _id: 1,
              fullName: 1,
              contracts: {
                type: "$contracts.contType",
                hours: "$contracts.contHours"
              }
            }
          }
        ]
      }
    },
    {
      $lookup: {
        from: "visits",
        localField: "visits",
        foreignField: "_id",
        as: "Visits",
        pipeline: [
          {
            $match: {
              $and: [
                {visitStart: {$gte: new Date(start)}},
                {visitEnd: {$lte: new Date(end)}}
              ]
            }
          },
          {
            $project: {
              _id: 1,
              client: "$client",
              hours: "$totalHours",
              month: {
                "$month": "$visitEnd"
              },
              year: {
                "$year": "$visitEnd"
              }
            }
          },
          {
            $project: {
              _id: 1,
              client: 1,
              hours: 1,
              date: {
                $concat: [
                  {
                    $substr: [
                      "$year",
                      0,
                      4
                    ]
                  },
                  "-",
                  {
                    $substr: [
                      "$month",
                      0,
                      2
                    ]
                  }
                ]
              }
            }
          },
          {
            $group: {
              _id: {
                date: "$date",
                client: "$client"
              },
              hoursCount: {
                $sum: "$hours"
              }
            }
          },
          {
            $group: {
              _id: "$_id.client",
              hours: {
                $push: {
                  date: "$_id.date",
                  count: "$hoursCount"
                }
              }
            }
          },
          {
            $project: {
              _id: 0,
              client: "$_id",
              hours: {
                $sortArray: {input: "$hours", sortBy: {date: 1}}
              }
            }
          }
        ]
      }
    },
    {
      $project: {
        _id: 0,
        "Clients": 1,
        "Visits": 1
      }
    },
    {
      $project: {
        result: {
          $map: {
            input: "$Clients",
            as: "client",
            in: {
              $mergeObjects: [
                "$$client",
                {
                  $arrayElemAt: [
                    {
                      $filter: {
                        input: "$Visits",
                        as: "visits",
                        cond: { $eq: ["$$visits.client", "$$client._id"]}
                      }
                    },
                    0
                  ]
                }
              ]
            }
          }
        } 
      }
    },

结果:

[
    {
        "result": [
            {
                "_id": "6205a8313fe12d6b4ec354c4",
                "fullName": "Johnny Cochrane",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 120
                },
                "client": "6205a8313fe12d6b4ec354c4",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.51
                    },
                    {
                        "date": "2023-5",
                        "count": 6
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            },
            {
                "_id": "6217c1b73fe12d6b4ec3550e",
                "fullName": "Sheila Thompson",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 140
                },
                "client": "6217c1b73fe12d6b4ec3550e",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.5
                    },
                    {
                        "date": "2023-5",
                        "count": 4
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            }
        ]
    }
]

我尝试了各种选项,例如最终阶段类似于这样的选项,但似乎无法正确实现:

{
      $replaceRoot: {
        newRoot: {
          $mergeObjects: [
            "$$ROOT",
            "$result"
          ]
        }
      }
    },

理想情况下,我只想得到实际的数据数组,如下所示:

[
            {
                "_id": "6205a8313fe12d6b4ec354c4",
                "fullName": "Johnny Cochrane",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 120
                },
                "client": "6205a8313fe12d6b4ec354c4",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.51
                    },
                    {
                        "date": "2023-5",
                        "count": 6
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            },
            {
                "_id": "6217c1b73fe12d6b4ec3550e",
                "fullName": "Sheila Thompson",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 140
                },
                "client": "6217c1b73fe12d6b4ec3550e",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.5
                    },
                    {
                        "date": "2023-5",
                        "count": 4
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            }
        ]
英文:

Not sure why I'm not getting this... I just want to return the results without the outer brackets, which I've done before fine, but the way my last stage is grouping, it sets up the results in a way that gives errors with $mergeObjects (error: input is an array) and $concatArrays (input is an object).

Pipeline:

User.aggregate([
    {
      $match: {
        _id: userId
      }
    },
    {
      $lookup: {
        from: 'clients',
        localField: "clients",
        foreignField: "_id",
        as: "Clients",
        pipeline: [
          {
            $project: {
              _id: 1,
              fullName: "$fullName",
              contracts: {$last: "$contracts"}
            }
          },
          {
            $project: {
              _id: 1,
              fullName: 1,
              contracts: {
                type: "$contracts.contType",
                hours: "$contracts.contHours"
              }
            }
          }
        ]
      }
    },
    {
      $lookup: {
        from: "visits",
        localField: "visits",
        foreignField: "_id",
        as: "Visits",
        pipeline: [
          {
            $match: {
              $and: [
                {visitStart: {$gte: new Date(start)}},
                {visitEnd: {$lte: new Date(end)}}
              ]
            }
          },
          {
            $project: {
              _id: 1,
              client: "$client",
              hours: "$totalHours",
              month: {
                "$month": "$visitEnd"
              },
              year: {
                "$year": "$visitEnd"
              }
            }
          },
          {
            $project: {
              _id: 1,
              client: 1,
              hours: 1,
              date: {
                $concat: [
                  {
                    $substr: [
                      "$year",
                      0,
                      4
                    ]
                  },
                  "-",
                  {
                    $substr: [
                      "$month",
                      0,
                      2
                    ]
                  }
                ]
              }
            }
          },
          {
            $group: {
              _id: {
                date: "$date",
                client: "$client"
                // hours: "$hours"
              },
              hoursCount: {
                $sum: "$hours"
              }
            }
          },
          {
            $group: {
              _id: "$_id.client",
              hours: {
                $push: {
                  date: "$_id.date",
                  count: "$hoursCount"
                }
              }
            }
          },
          {
            $project: {
              _id: 0,
              client: "$_id",
              hours: {
                $sortArray: {input: "$hours", sortBy: {date: 1}}
              }
            }
          }
        ]
      }
    },
    {
      $project: {
        _id: 0,
        "Clients": 1,
        "Visits": 1
      }
    },
    {
      $project: {
        result: {
          $map: {
            input: "$Clients",
            as: "client",
            in: {
              $mergeObjects: [
                "$$client",
                {
                  $arrayElemAt: [
                    {
                      $filter: {
                        input: "$Visits",
                        as: "visits",
                        cond: { $eq: ["$$visits.client", "$$client._id"]}
                      }
                    },
                    0
                  ]
                }
              ]
            }
          }
        } 
      }
    },

Result:

[
    {
        "result": [
            {
                "_id": "6205a8313fe12d6b4ec354c4",
                "fullName": "Johnny Cochrane",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 120
                },
                "client": "6205a8313fe12d6b4ec354c4",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.51
                    },
                    {
                        "date": "2023-5",
                        "count": 6
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            },
            {
                "_id": "6217c1b73fe12d6b4ec3550e",
                "fullName": "Sheila Thompson",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 140
                },
                "client": "6217c1b73fe12d6b4ec3550e",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.5
                    },
                    {
                        "date": "2023-5",
                        "count": 4
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            }
        ]
    }
]

I've tried various options around a final stage like this, but cannot seem to get it right:

{
      $replaceRoot: {
        newRoot: {
          $mergeObjects: [
            "$$ROOT",
            "$result"
          ]
        }
      }
    },

Ideally I'd just have the actual data array like so:

[
            {
                "_id": "6205a8313fe12d6b4ec354c4",
                "fullName": "Johnny Cochrane",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 120
                },
                "client": "6205a8313fe12d6b4ec354c4",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.51
                    },
                    {
                        "date": "2023-5",
                        "count": 6
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            },
            {
                "_id": "6217c1b73fe12d6b4ec3550e",
                "fullName": "Sheila Thompson",
                "contracts": {
                    "type": "Quarterly",
                    "hours": 140
                },
                "client": "6217c1b73fe12d6b4ec3550e",
                "hours": [
                    {
                        "date": "2023-4",
                        "count": 5.5
                    },
                    {
                        "date": "2023-5",
                        "count": 4
                    },
                    {
                        "date": "2023-6",
                        "count": 2
                    }
                ]
            }
        ]

Thanks for any guidance.

答案1

得分: 0

不确定我没有理解的是什么,但需要执行 $unwind "$result" - 将数组转换为对象,然后使用 $replaceRoot。出于某种原因,我以为我已经这样做了...可能只是动作太快。

{
  $unwind: "$result"
},
{
  $replaceRoot: {
    newRoot: "$result"
  }
}
英文:

Not sure what I wasn't getting, but needed to $unwind "$result" - turned the array to object, then $replaceRoot. For some reason I had thought I did that... maybe just moving too fast.

{
      $unwind: "$result"
    },
    {
      $replaceRoot: {
        newRoot:  "$result"        
      }
    }

答案2

得分: 0

.pop() 它。

let a = ["test"];
let b = a.pop();

console.log(b);
英文:

.pop() it.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

let a = [&quot;test&quot;];
let b = a.pop()

console.log(b)

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年6月16日 06:40:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/76485919.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定