gpt4 book ai didi

MongoDB:将文档对象分配给 '$project' 阶段的字段

转载 作者:行者123 更新时间:2023-12-04 08:21:56 31 4
gpt4 key购买 nike

我有一个用户集合:

[
{"_id": 1,"name": "John", "age": 25, "valid_user": true}
{"_id": 2, "name": "Bob", "age": 40, "valid_user": false}
{"_id": 3, "name": "Jacob","age": 27,"valid_user": null}
{"_id": 4, "name": "Amelia","age": 29,"valid_user": true}
]
我运行一个 '$facet'这个系列的舞台。查看此 MongoPlayground .
我想谈谈facet阶段的第一个输出。以下是目前的回应:
{
"user_by_valid_status": [
{
"_id": false,
"count": 1
},
{
"_id": true,
"count": 2
},
{
"_id": null,
"count": 1
}
]
}
但是,我想以这种方式重构输出:
"analytics": {
"invalid_user": {
"_id": false
"count": 1
},
"valid_user": {
"_id": true
"count": 2
},
"user_with_unknown_status": {
"_id": null
"count": 1
}
}
使用 '$project' 的问题与舞台一起 'arrayElemAt'对我来说,将索引与像 'valid_users' 这样的属性相关联的顺序可能不确定。或其他。此外,它变得更加复杂,因为与我共享的示例文档不同,我的集合可能并不总是包含所有三类用户。
有什么办法可以做到这一点吗?

最佳答案

您可以使用 $switch条件运算符,

  • $projectv 中显示值部分以 _id 和 count 字段作为对象,k$switch条件
  • db.collection.aggregate([
    {
    "$facet": {
    "user_by_valid_status": [
    {
    "$group": {
    "_id": "$valid_user",
    "count": { "$sum": 1 }
    }
    },
    {
    $project: {
    _id: 0,
    v: { _id: "$_id", count: "$count" },
    k: {
    $switch: {
    branches: [
    { case: { $eq: ["$_id", null] }, then: "user_with_unknown_status" },
    { case: { $eq: ["$_id", false] }, then: "invalid_user" },
    { case: { $eq: ["$_id", true] }, then: "valid_user" }
    ]
    }
    }
    }
    }
    ],
    "users_above_30": [{ "$match": { "age": { "$gt": 30 } } }]
    }
    },
  • $project根阶段,转换 user_by_valid_status数组到对象使用 $arrayToObject
  •   {
    $project: {
    analytics: { $arrayToObject: "$user_by_valid_status" },
    users_above_30: 1
    }
    }
    ])
    Playground

    关于MongoDB:将文档对象分配给 '$project' 阶段的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65454527/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com