mongodb - problème de requête complexe mongo
我想大声告诉你
我想大声告诉你 2017-05-02 09:25:22
0
4
773

Json original

{
    "_id" : ObjectId("58b3a8dc96fbc7cfb8287093"),
    "name" : "《地下水质量标准》",
    "GBNumber" : "GB/T 14848-93",
    "dataEntryClerk" : "handsomeboy",
    "lastModified" : "Fri Feb 27 2017 12:03:40 GMT+0800",
    "contents" : [ 
        {
            "standardID" : "9527-01",
            "unit" : "mg/L",
            "classifications" : [ 
                {
                    "level" : "I",
                    "upperLimit" : "0",
                    "lowerLimit" : "50"
                }, 
                {
                    "level" : "II",
                    "upperLimit" : "50",
                    "lowerLimit" : "150"
                }, 
                {
                    "level" : "III",
                    "upperLimit" : "150",
                    "lowerLimit" : "250"
                }, 
                {
                    "level" : "IV",
                    "upperLimit" : "250",
                    "lowerLimit" : "350"
                }, 
                {
                    "level" : "V",
                    "upperLimit" : "350",
                    "lowerLimit" : "-1"
                }
            ]
        }, 
        {
            "standardID" : "7439-89-6",
            "unit" : "mg/L",
            "classifications" : [ 
                {
                    "level" : "I",
                    "upperLimit" : "0",
                    "lowerLimit" : "0.1"
                }, 
                {
                    "level" : "II",
                    "upperLimit" : "0.1",
                    "lowerLimit" : "0.2"
                }, 
                {
                    "level" : "III",
                    "upperLimit" : "0.2",
                    "lowerLimit" : "0.3"
                }, 
                {
                    "level" : "IV",
                    "upperLimit" : "0.3",
                    "lowerLimit" : "0.4"
                }, 
                {
                    "level" : "V",
                    "upperLimit" : "0.5",
                    "lowerLimit" : "-1"
                }
            ]
        }
    ]
}

Les résultats que vous souhaitez interroger :

{
    "contents" : [ 
        {
            "standardID" : "9527-01",
            "unit" : "mg/L",
            "classifications" : [ 
                {
                    "level" : "I",
                    "upperLimit" : "0",
                    "lowerLimit" : "50"
                }, 
                {
                    "level" : "II",
                    "upperLimit" : "50",
                    "lowerLimit" : "150"
                }, 
                {
                    "level" : "III",
                    "upperLimit" : "150",
                    "lowerLimit" : "250"
                }, 
                {
                    "level" : "IV",
                    "upperLimit" : "250",
                    "lowerLimit" : "350"
                }, 
                {
                    "level" : "V",
                    "upperLimit" : "350",
                    "lowerLimit" : "-1"
                }
            ]
        }
    ]
}

Pourriez-vous s'il vous plaît me dire comment écrire db.xxx.find()

我想大声告诉你
我想大声告诉你

répondre à tous(4)
刘奇

Je voudrais d'abord faire un commentaire :

Posez une question et postez un exemple du problème reproductible qui est minimisé Si vous publiez un document aussi long, tout le monde sera fatigué de le lire.


Ce dont vous avez besoin est en fait de renvoyer certains documents spécifiques dans le tableau, pas le tableau entier.

1 Si vous n'avez besoin de renvoyer qu'un seul élément dans le tableau

db.xxx.find(
    {'contents.standardID': '9527-01'},
    {contents: {$elemMatch: {standardID: '9527-01'}}, _id: 0}
)

La première ligne est la condition de requête et la deuxième ligne est la condition de filtre. Vous pouvez voir que les opérateurs peuvent également être utilisés dans des conditions de filtrage. Cependant, cet opérateur ne renverra que le premier élément qui remplit la condition et nécessite MongoDB version 2.2 ou supérieure .

Ou utilisez le sélecteur d'indice $ :

db.xxx.find(
    {'contents.standardID': '9527-01'},
    {'contents.$': 1, _id: 0}
)

Les conditions de requête de l'exemple ci-dessus peuvent également être utilisées $elemMatch.

Si vous devez renvoyer plusieurs éléments correspondants dans un tableau :

2 $unwind

fonctionne sur $unwind comme un flux de documents indépendant en utilisant contents Pour le code, voir la réponse de @bguo.
Mais cela peut entraîner des problèmes de performances si votre baie est grande.

3 $filter

Il s'agit d'un nouvel opérateur dans la version 3.2, utilisé pour filtrer le contenu renvoyé.

db.xxx.aggregate(
    {$match: {'contents.standardID': '9527-01'}},
    {$project: {
        contents: {$filter: {
            input: '$contents',
            as: 'contents',
            cond: {$eq: ['$$contents.standardID', '9527-01']}
        }},
        _id: 0
    }}
)

Bien sûr, vous pouvez également utiliser $redact (version 2.6), ou mapReduce() et bien d'autres méthodes.

为情所困

Conditions de requête. Par exemple nom

db.xxx.find({"name" : "《地下水质量标准》" } ,function(err, data){ 
    if(data){
        console.log(data.contents)
    }
})
给我你的怀抱

Une méthode d'implémentation : utiliser l'agrégat de MongoDB.

1. Appliquez d’abord $unwind au contenu contenant le tableau

2. Utilisez ensuite $match pour appliquer des conditions de filtrage

3. Enfin, utilisez $project pour conserver les champs obligatoires

Référez-vous au code ci-dessous

 db.test1.aggregate([
                    {$unwind : "$contents"},
                    {$match : { name :  "《地下水质量标准》", "contents.standardID" :  "9527-01"}},
                    { $project : { contents : 1 , _id : 0 }}
                    ])

Pour référence.

J'adore MongoDB ! Amusez-vous !

------------------------Magnifique séparateur------------------ --- ----------

La communauté chinoise MongoDB propose de nombreuses activités hors ligne, veuillez cliquer ci-dessous :

Discussion sur Huashan Sword 2017|Communauté chinoise MongoDB

La gare de Hangzhou en mars arrive bientôt ! ! ! Amis intéressés, inscrivez-vous vite ! ! !

给我你的怀抱
db.xxx.find({"contents.standardID": "9527-01"}, {contents: 1})

_id字段会自动输出,就忽略吧
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal