代码之家  ›  专栏  ›  技术社区  ›  Deepak Aggarwal

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

  •  1
  • Deepak Aggarwal  · 技术社区  · 6 年前

    我有一个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"}}])
    

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

    3 回复  |  直到 6 年前
        1
  •  2
  •   felix    6 年前

    尝试此查询:

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

    您可以在此处在线试用: mongoplayground.net/p/1HY-GSMnzoX

        2
  •  1
  •   chridam Gino Claudi    6 年前

    您可以结合使用 $arrayElemAt ,则, $map $filter 数组运算符以实现所需的结果。

    带有 $筛选器 操作员将过滤 RECORD_DATA 数组中仅包含具有 FIELD_TYPE 价值 "Primary"

    这个 $地图 然后,运算符将从上面返回的结果映射为只输出一个 DATA 价值观这个 $arrayElemAt 然后将返回该列表中的第一个元素,然后可以对其进行投影。

    以下内容说明了上述内容:

    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
                ]
            }
        } }
    ])
    
        3
  •  1
  •   Rubin Porwal    6 年前
    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'
                }
            }
    
        ]
    
    
    );