Bagaimana cara memfilter berdasarkan kunci, menemukan berdasarkan rentang tanggal, dan kemudian menggabungkan berdasarkan minggu di mongodb?

Saya memiliki koleksi mongo bernama MyCollection yang terdiri dari dokumen seperti ini:

{ 
    "_id" : ObjectId("58085384e4b0f70605461e3f"), 
    "uid" : "fa1aeafc-18db-41a5-8ee5-ac0c32428fe1",
    "Key1" : "Value1"  
    "timeStamp" : ISODate("2016-08-23T17:58:20.000+0000"), 
}

Beberapa dokumen memiliki Key1, sementara yang lain memiliki Key2 atau Key3.

Sekarang, saya ingin melakukan hal berikut: -

  1. Dapatkan hanya dokumen yang memiliki Key1 atau Key2.
  2. Dari kumpulan dokumen yang dihasilkan di atas, dapatkan hanya dokumen yang berada dalam kisaran timeStamp Date(2016, 08, 01) hingga Date(2016, 08, 31).
  3. Untuk kumpulan dokumen yang dihasilkan di atas, gabungkan berdasarkan minggu.

Bagaimana cara saya menulis permintaan mongo untuk ini?


person Train Heartnet    schedule 14.03.2017    source sumber


Jawaban (2)


Dengan menggunakan kerangka agregasi, langkah-langkah di atas dapat dilakukan dengan $match dan $group langkah-langkah pipeline sebagai berikut:

var start = new Date(2016, 7, 1), // months are zero-based indexes i.e Aug month index is 7
    end = new Date(2016, 7, 30); // August month ends on the 30th

db.collection.aggregate([
    { /* filter steps 1 & 2 */
        "$match": {
            "$or": [
                { "Key1": { "$exists": true } },
                { "Key2": { "$exists": true } }
            ],
            "timeStamp": { "$gte": start, "$lte": end }
        }
    },
    { /* group by week */ 
        "$group": {
            "_id": { "$week": "$timeStamp" },
            "count": { "$sum": 1 },
            "uids": { "$push": "$uid" }
        }
    }
])

Pada gambar di atas, rentang tanggal dibuat menggunakan Date() konstruktor dengan bulan adalah indeks berbasis nol. Operator $exists digunakan untuk tentukan keberadaan kunci dan gunakan $week operator agregat tanggal untuk mendapatkan nomor minggu pada tanggal antara 0 (sebagian minggu sebelum hari Minggu pertama tahun tersebut) dan 53 (tahun kabisat).

Untuk nomor minggu yang dimulai dari 1 minggu (Senin hingga Minggu) yang berisi Kamis pertama tahun tersebut, MongoDB 3.4 dan yang lebih baru menyediakan $isoweek untuk digunakan.

person chridam    schedule 14.03.2017

coba ini:

db.collection.find(
{$or:[{"key1":{$exists:true}},{"key2":{$exists:true}}],
timeStamp: {$gte: Date(2016, 08, 01), $lte:Date(2016, 08, 31)}
})

Permintaan di atas memenuhi syarat 1 dan 2 Anda. Apa syarat ketiga Anda, saya tidak mengerti sepenuhnya, harap jelaskan.

person Vaibhav Patil    schedule 14.03.2017