首页 > 解决方案 > 如何使用 mongo 聚合添加自定义字段?

问题描述

我收藏的文档结构如下:

{
    "tracking": [
        {
            "track_id": "abcd",
            "track_name": "Sample track"
        }, {...}, ...
    ]
}

我在一个称为跟踪的数组中有多个这样的对象。现在我正在尝试使用 mongo 聚合添加一个名为current_status的字段,如下所示:

        {
            "$addFields": {
                "current_status": {
                    "$cond": {
                        "if": {"tracking.track_id": {"$in": ['abcd']}},
                        "then": "Approved",
                        "else": "Pending"
                    }
                }
            }
        }

运行此程序后,我收到以下错误:

pymongo.errors.OperationFailure: Invalid $addFields :: caused by :: FieldPath field names may not contain '.'.

我想根据跟踪数组中是否存在带有 track_id abcd的对象,在 Mongo 聚合查询的结果中添加一个新字段。

标签: mongodbmongodb-queryaggregation-frameworkpymongopymongo-3.x

解决方案


尝试这个:

db.collection.aggregate([
    {
        "$addFields": {
            "tracking": {
                "$map": {
                    "input": "$tracking",
                    "as": "item",
                    "in": {
                        "$cond": {
                            "if": { "$eq": ["$$item.track_id", "abcd"] },
                            "then": {
                                "track_id": "$$item.track_id",
                                "track_name": "$$item.track_name",
                                "current_status": "Approved"
                            },
                            "else": {
                                "track_id": "$$item.track_id",
                                "track_name": "$$item.track_name",
                                "current_status": "Pending"
                            }
                        }
                    }
                }
            }
        }
    }
])

输出:

{
    "_id" : ObjectId("604f50859ee8b82dd8cd9f4a"),
    "tracking" : [
        {
            "track_id" : "abcd",
            "track_name" : "Sample track 1",
            "current_status" : "Approved"
        },
        {
            "track_id" : "fdsdf",
            "track_name" : "Sample track 2",
            "current_status" : "Pending"
        }
    ]
}

推荐阅读