MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Dapatkan nilai berbeda dari array berdasarkan kondisi di dalam array

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".



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menggunakan $ operator posisional di driver MongoDB C # versi 2

  2. Bagaimana cara membuat dan meneruskan dokumen bson - Go lang?

  3. Membangun indeks di MongoDB dengan .NET driver 2.0

  4. findOneAndUpdate menyebabkan masalah duplikasi

  5. Bagaimana cara mengganti substring dalam dokumen mongodb