mongodb - masalah pertanyaan kompleks mongo
我想大声告诉你
我想大声告诉你 2017-05-02 09:25:22
0
4
778

Json asal

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

Hasil yang anda ingin tanya:

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

Bolehkah anda beritahu saya cara menulis db.xxx.find()

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

membalas semua(4)
刘奇

Saya ingin membuat ulasan terlebih dahulu:

Tanya soalan dan siarkan contoh masalah boleh dihasilkan yang diminimumkan Jika anda menyiarkan dokumen yang begitu panjang, semua orang akan bosan membacanya.


Apa yang anda perlukan sebenarnya ialah memulangkan beberapa dokumen tertentu dalam tatasusunan , bukan keseluruhan tatasusunan.

1 Jika anda hanya perlu mengembalikan satu elemen dalam tatasusunan

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

Baris pertama ialah syarat pertanyaan, dan baris kedua ialah syarat penapis. Anda boleh melihat bahawa pengendali juga boleh digunakan dalam keadaan penapis. Walau bagaimanapun, pengendali ini hanya akan mengembalikan elemen pertama yang memenuhi syarat dan memerlukan MongoDB versi 2.2 atau lebih tinggi .

Atau gunakan $ pemilih subskrip:

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

Syarat pertanyaan dalam contoh di atas juga boleh digunakan $elemMatch.

Jika anda perlu mengembalikan berbilang elemen padanan dalam tatasusunan:

2 $unwind

beroperasi pada $unwind sebagai strim dokumen bebas dengan menggunakan contents Untuk kod, lihat jawapan @bguo.
Tetapi ini boleh menyebabkan masalah prestasi jika tatasusunan anda besar.

3 $filter

Ini ialah operator baharu dalam versi 3.2, digunakan untuk menapis kandungan yang dikembalikan.

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

Sudah tentu anda juga boleh menggunakan $redact (versi 2.6), atau mapReduce() dan banyak kaedah lain.

为情所困

Syarat pertanyaan. Contohnya nama

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

Satu kaedah pelaksanaan: menggunakan Agregat MongoDB.

1. Mula-mula gunakan $unwind pada kandungan yang mengandungi tatasusunan

2. Kemudian gunakan $match untuk menggunakan syarat penapisan

3 Akhir sekali, gunakan $project untuk mengekalkan medan yang diperlukan

Rujuk kod di bawah

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

Untuk rujukan.

Sayangi MongoDB!

------------------------ Pemisah cantik------------------ --- ----------

Komuniti Cina MongoDB mempunyai banyak aktiviti luar talian, sila klik di bawah:

Perbincangan Pedang Huashan 2017|Komuniti Cina MongoDB

Stesen Hangzhou pada bulan Mac akan datang tidak lama lagi! ! ! Rakan-rakan yang berminat sila daftar segera! ! !

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

_id字段会自动输出,就忽略吧
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan