J'ai une collection mongoDB avec des documents qui ressemblent à:

{
    "_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"
        }
    ]
}

Je souhaite extraire le champ unique de RECORD_DATA qui a FIELD_TYPE défini sur Primary avec _id pour chaque document de la collection. Ma sortie finale devrait ressembler à:

{
    "_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."
}

J'ai essayé l'agrégation Requête:

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

Cela ne me donne aucune sortie. Quelqu'un peut-il m'aider à créer une requête pour cela?

1
Deepak Aggarwal 11 avril 2018 à 14:20

3 réponses

Meilleure réponse

Vous pouvez utiliser une combinaison de $arrayElemAt , $map et $filter opérateurs de tableaux pour obtenir le résultat souhaité.

L'expression avec le $filter < L'opérateur / strong> filtrera le tableau RECORD_DATA pour avoir uniquement les documents qui ont la valeur FIELD_TYPE "Primary".

Le $map L'opérateur mappera ensuite le résultat renvoyé ci-dessus pour simplement sortir un tableau de valeurs DATA uniques. Le $arrayElemAt retournera alors le premier élément de cette liste qui pourra ensuite être projeté.

Ce qui suit illustre ce qui précède:

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
            ]
        }
    } }
])
1
chridam 11 avril 2018 à 14:06

Essayez cette requête:

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

Vous pouvez l'essayer en ligne ici: mongoplayground.net/p/1HY-GSMnzoX

2
felix 11 avril 2018 à 11:34
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'
            }
        }

    ]


);
1
Rubin Porwal 15 avril 2018 à 18:15