如何在python中为包含嵌套文档列表的文档创建mongoDB聚合查询?

2024-09-28 05:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个mongoDB集合,其中包含如下文档:

{
    "_id" : "132743",
    "RECORD_DATA" : [ 
        {
            "FIELD_TYPE" : "Primary",
            "DATA" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit leo sit amet nisi ultricies bibendum. Aenean efficitur pharetra diam, non pretium nisi blandit eu. Maecenas eget dolor sed ipsum semper posuere id eget purus. Ut tempor massa vel porta euismod. Vivamus et elementum justo. Aliquam porta, ipsum at semper pulvinar, turpis ipsum congue orci, a fringilla turpis arcu eget lorem. Vestibulum consectetur sapien neque, at vulputate mi congue vitae.",
            "DETAIL" : "XYZ"
        },  
        {
            "FIELD_TYPE" : "Secondary",
            "DATA" : "Nullam congue aliquam risus. Aenean semper ut elit id viverra. Mauris tincidunt non justo et tempor. Donec non tempus sapien. Curabitur facilisis risus tortor, nec bibendum libero feugiat sed. Curabitur eu quam ac mi sodales ultricies. Cras posuere tincidunt faucibus.",
            "DETAIL" : "XYZ"
        },
        {
            "FIELD_TYPE" : "Secondary",
            "DATA" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ",
            "DETAIL" : "ABC"
        }, 
        {
            "FIELD_TYPE" : "Secondary",
            "DATA" : "Maecenas volutpat facilisis tortor sed pellentesque. Quisque tristique sem sit amet ipsum convallis porttitor. Vestibulum a tempus ex. Donec molestie tortor est, sed malesuada sapien maximus vel.",
            "DETAIL" : "ABC"
        },
        {
            "FIELD_TYPE" : "optional1",
            "DATA" : "Curabitur faucibus dolor nisl, at venenatis tortor fermentum at. Vestibulum sodales posuere neque id aliquet. Aliquam dignissim ex quis lacus fermentum, at consectetur nunc viverra. ",
            "DETAIL" : "XYZ"
        }, 
        {
            "FIELD_TYPE" : "optional2",
            "DATA" : "Cras vulputate lacinia elit, eu fringilla neque imperdiet eget. Nam placerat venenatis felis at pharetra. Praesent vestibulum ligula sit amet elit dignissim suscipit. ",
            "DETAIL" : "QWE"
        }
    ]
}

我想从RECORD_DATA中提取单个字段,对于集合中的每个文档,FIELD_TYPE设置为Primary以及_id。我的最终输出应该如下所示:

{
    "_id" : "132743",
    "DATA" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit leo sit amet nisi ultricies bibendum. Aenean efficitur pharetra diam, non pretium nisi blandit eu. Maecenas eget dolor sed ipsum semper posuere id eget purus. Ut tempor massa vel porta euismod. Vivamus et elementum justo. Aliquam porta, ipsum at semper pulvinar, turpis ipsum congue orci, a fringilla turpis arcu eget lorem. Vestibulum consectetur sapien neque, at vulputate mi congue vitae."
}

我尝试了聚合查询:

MongoDatabase.db[collection].aggregate([{$project:{'DATA':'$RECORD_DATA.DATA'}},{$match:{'RECORD_DATA.FIELD_TYPE':"Primary"}}])

这并没有给我任何输出。有人能帮我创建一个查询吗


Tags: idfielddatatypesedatdetailipsum
3条回答

尝试此查询:

db.collection.aggregate([{
    "$unwind": "$RECORD_DATA"
}, {
    "$match": {
        "RECORD_DATA.FIELD_TYPE": "Primary"
    }
}, {
    "$project": {
        "_id": 1,
        "DATA": "$RECORD_DATA.DATA"
    }
}])

你可以在这里在线试用:mongoplayground.net/p/1HY-GSMnzoX

可以组合使用^{}^{}^{}数组运算符来获得所需的结果

带有^{}运算符的表达式将过滤RECORD_DATA数组,使其仅包含具有FIELD_TYPE"Primary"的文档

然后^{}操作符将从上面返回的结果映射到只输出单个DATA值的数组。^{}然后将返回该列表中的第一个元素,然后可以投影该元素

以下说明了上述情况:

MongoDatabase.db[collection].aggregate([
    { "$match": { "RECORD_DATA.FIELD_TYPE": "Primary" } },
    { "$project": {
        "DATA": {
            "$arrayElemAt": [
                {
                    "$map": {
                        "input": {
                            "$filter": {
                                "input": "$RECORD_DATA",
                                "as": "record",
                                "cond": { "$eq": ["$$record.FIELD_TYPE", "Primary"] }
                            }
                        },
                        "as": "el",
                        "in": "$$el.DATA"
                    }
                },
                0
            ]
        }
    } }
])
db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                RECORD_DATA: {
                    $elemMatch: {
                        FIELD_TYPE: "Primary"
                    }
                }
            }
        },

        // Stage 2
        {
            $project: {
                'RECORD_DATA': {
                    $arrayElemAt: [{
                        $filter: {
                            input: '$RECORD_DATA',
                            as: "data",
                            cond: {
                                $eq: ["$$data.FIELD_TYPE", 'Primary']
                            }
                        }
                    }, 0]
                }

            }
        },

        // Stage 3
        {
            $project: {
                _id: 1,
                DATA: '$RECORD_DATA.DATA'
            }
        }

    ]


);

相关问题 更多 >

    热门问题