簡體   English   中英

如何在python中為包含嵌套文檔列表的文檔創建mongoDB聚合查詢?

[英]How to create a mongoDB aggregate query in python for documents which contain nested list of documents?

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

這沒有給我任何輸出。 有人可以幫我創建查詢嗎?

試試這個查詢:

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

您可以在此處在線嘗試: mongoplayground.net/p/1HY-GSMnzoX

您可以結合使用$arrayElemAt$map$filter數組運算符來獲得所需的結果。

使用$filter運算符的表達式將過濾RECORD_DATA數組,使其僅包含具有FIELD_TYPE"Primary"文檔。

然后$map運算符將映射從上面返回的結果,以僅輸出單個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
            ]
        }
    } }
])
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'
            }
        }

    ]


);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM