Ketentuan kueri dengan .distinct()
berlaku untuk "pemilihan dokumen" dan bukan entri larik yang berisi "di dalam" dokumen. Jika Anda perlu "memfilter" konten array maka Anda menerapkan .aggregate()
sebagai gantinya, serta sedikit pemrosesan pos untuk mendapatkan hanya "nilai" dalam respons array.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
Bagian utama ada $unwind
tahap pipa yang Anda lakukan terutama karena Anda ingin nilai dari dalam larik digunakan nanti sebagai kunci untuk $group
pada. Ini pada dasarnya menghasilkan dokumen baru untuk setiap anggota array, tetapi setiap dokumen hanya berisi anggota array itu. Ini "denormalisasi" untuk struktur MongoDB yang berisi array.
Selanjutnya adalah berikut $match
pipeline, yang berfungsi seperti kueri apa pun dan hanya memilih dokumen yang sesuai dengan ketentuan. Karena semua anggota array sekarang adalah "dokumen" maka entri yang tidak cocok (sebagai dokumen) dikecualikan. Anda dapat menggunakan $filter
secara bergantian
untuk mengekstrak saat masih berupa array, tetapi karena kita memerlukan $unwind
untuk tahap selanjutnya kita cukup $match
.
Pada titik ini Anda hanya tersisa dengan entri array yang cocok dengan kondisi. $group
adalah untuk mendapatkan nilai "berbeda", jadi biasanya Anda akan melakukan ini pada pilihan yang lebih luas daripada hanya satu dokumen atau apa pun di mana nilai di sini belum berbeda. Jadi ini benar-benar hanya menjaga semua perilaku yang sama dari .distinct()
utuh.
Akhirnya, karena keluaran .aggregate()
berbeda dengan desain .distinct()
karena mengembalikan "dokumen" dalam hasil, kami cukup menggunakan .map()
metode untuk memproses hasil kursor dan hanya mengembalikan "nilai" dari properti dokumen tertentu sebagai "array".