Cocok dengan bidang _id gabungan dalam agregat MongoDB

Saya seorang pemula MongoDB jadi mohon maafkan saya jika pertanyaan ini memiliki jawaban yang jelas...

Konteks:

Saya telah mengikuti contoh di dokumen MongoDB untuk menerapkan agregasi hierarki menggunakan pengurangan peta. Contoh ini menggunakan bidang "gabungan" _id sebagai kunci pengurangan peta yang menghasilkan dokumen agregat seperti ini...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

Ini semua baik dan bagus. Kasus penggunaan khusus saya mengharuskan nilai untuk beberapa kunci serupa dikeluarkan setiap map langkah. Misalnya...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

(Nilainya sama, namun kunci _id sedikit berbeda.)

Ini juga bagus dan bagus.

Pertanyaan:

Sekarang saya ingin menggabungkan koleksi hierarki (tampilan) saya, yang berisi dokumen yang memiliki beberapa bidang gabungan _id yang berbeda, tetapi hanya pada dokumen dengan bidang $matching _id. Misalnya, saya ingin menggabungkan hanya dokumen yang memiliki tipe {u: String, d: Date, hobby: String} _id atau hanya dokumen dengan tipe _id {u: String, d: Date}.

Saya sadar bahwa saya dapat menggunakan operator $exists untuk membatasi bidang _id mana yang boleh dan tidak boleh diizinkan, tetapi saya tidak ingin membuat agregasi terpisah untuk setiap _id (berpotensi banyak).

Apakah ada cara sederhana untuk membatasi $matching dokumen secara terprogram ke dokumen yang berisi (atau tidak berisi) bidang tertentu secara agregat?


person jonas    schedule 23.07.2013    source sumber


Jawaban (1)


Menurut saya cara terbaik untuk mengatasi masalah ini adalah dengan menyimpan data Anda secara berbeda. Jenis "_id" Anda memiliki nilai arbitrer sebagai kuncinya dan itu adalah sesuatu yang harus Anda hindari. Saya mungkin akan menyimpan dokumen sebagai:

{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" }
}
{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" },
}

Dan kemudian pencocokan Anda menjadi sederhana bahkan tanpa harus membuat pencocokan berbeda untuk setiap jenis.

person Derick    schedule 24.07.2013
comment
Cukup adil, namun bagaimana jika saya harus mencocokkan hanya berdasarkan _id bidang? - person jonas; 24.07.2013
comment
Dalam kasus saya, bidang _id tidak sesederhana yang saya buat di sini (misalnya, berbeda satu bidang). Pertanyaan saya adalah bagaimana $match (berpotensi menggunakan operator $exists) berdasarkan bidang yang ada (dan tidak ada) di bidang _id tanpa harus menghitung semua kemungkinan kombinasi bidang. Jadi, dengan templat _id, saya ingin menggabungkan hanya pada dokumen yang memiliki bidang _id yang cocok dengan templat tersebut. - person jonas; 24.07.2013
comment
Mengapa Anda tetap memasukkan semua ini ke _id? - person Derick; 24.07.2013
comment
Ini adalah hasil dari proses pengurangan peta. - person jonas; 24.07.2013
comment
Saya pikir Anda harus melukiskan gambaran keseluruhan dari apa yang Anda coba lakukan karena saya hanya melihat sebagian kecil - yang bukan merupakan dasar yang bagus untuk memberikan dukungan! - person Derick; 24.07.2013
comment
Bisakah Anda memberikan masukan dan keluaran yang diinginkan (sesuai dengan masukan yang diberikan). Jadi dimungkinkan untuk mengimpor dokumen-dokumen itu dan mengujinya. - person Fake Fish; 04.05.2016