Bagaimana cara membuat kueri bersarang di mongodb?

Sekarang pertanyaannya adalah bagaimana mendapatkan array userid di operator $in yang diekstrak dengan kueri sehingga seluruh kueri dapat dibuat dengan satu permintaan

"Kueri bersarang" seperti ini tidak berfungsi

db.user.find[{_id:{$in:db.usergroup.find[{_id:"g1"},{_id:0,Users:1}]}}].forEach[printjson];

Memberikan kesalahan ini
Sel 27 Mar 06. 17. 41 pengecualian yang tidak tertangkap. kesalahan. { "$err". "kueri tidak valid", "kode". 12580 }
gagal untuk memuat. mongoNestedSelect. js

1] apakah ini mungkin di mongodb dan bagaimana caranya?

2] bagaimana melakukan ini dengan driver c# resmi?

Solusi terbaik

Jawaban atas pertanyaan semacam itu di MongoDB sering kali adalah mendenormalisasi data Anda. Jika Anda hanya memerlukan daftar pengguna dalam grup, Anda dapat menyimpan ID pengguna dan Nama pengguna dalam dokumen grup. Dalam beberapa hal Anda menyusun database Anda sesuai dengan hasil yang ingin Anda lihat di layar daripada mencoba memasukkannya ke dalam format yang dinormalisasi

Jelas itu hanya akan berfungsi jika daftar grup pengguna Anda [dengan nama] dapat ditampung dalam satu dokumen, tetapi pendekatan Anda saat ini juga memiliki beberapa batasan terkait ukuran maksimum grup

Pendekatan lain adalah dengan menyimpan grup yang dimiliki pengguna dalam larik pada setiap dokumen 'Pengguna'. Tambahkan indeks pada bidang larik itu dan sekarang Anda dapat menemukan pengguna berdasarkan grup. Mengingat bahwa pengguna cenderung menjadi anggota grup yang lebih sedikit daripada jumlah anggota dalam grup, ini mungkin pendekatan terbaik di sini

db.user.save[{_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]}];
_

Sekali lagi Anda dapat menyimpan nama grup dengan _id-nya sehingga Anda dapat segera menampilkan daftar grup yang dimiliki pengguna dengan sekali jalan pulang pergi. Tentu saja, jika Anda mengizinkan perubahan nama grup, Anda harus memulai tugas latar belakang untuk memperbaiki semua salinan nama ini

Saya juga akan menggunakan generator id MongoDB bawaan daripada milik Anda, ia memiliki banyak properti yang diinginkan

Solusi Terkait

Mongodb – Cara melakukan SQL Join yang setara di MongoDB

Pada Mongo 3. 2 jawaban atas pertanyaan ini sebagian besar tidak lagi benar. Operator $lookup baru yang ditambahkan ke pipa agregasi pada dasarnya identik dengan gabungan luar kiri

Dari dokumen

{
   $lookup:
     {
       from: ,
       localField: ,
       foreignField: ,
       as: 
     }
}

Tentu saja Mongo bukan basis data relasional, dan pengembang berhati-hati untuk merekomendasikan kasus penggunaan khusus untuk $lookup, tetapi setidaknya pada 3. 2 bergabung sekarang dimungkinkan dengan MongoDB

Sql – Cara menanyakan MongoDB dengan "suka"

Itu pasti

db.users.find[{"name": /.*m.*/}]

Atau, serupa

db.users.find[{"name": /m/}]
_

Anda sedang mencari sesuatu yang berisi "m" di suatu tempat [Operator '%' SQL setara dengan ekspresi reguler' '.*'], bukan sesuatu yang memiliki "m" berlabuh ke awal string

Catatan. MongoDB menggunakan ekspresi reguler yang lebih kuat daripada "SEPERTI" di SQL. Dengan ekspresi reguler, Anda dapat membuat pola apa pun yang Anda bayangkan

MongoDB adalah database NoSQL berorientasi dokumen sumber terbuka. Kami telah memperkenalkan cara menggunakan mongosh untuk menjalankan perintah CRUD dasar di konsol. Selain itu, kami juga telah memperkenalkan cara menggunakan MongoDB Atlas untuk menghosting server dan data MongoDB Anda. Dalam posting ini, kita akan melangkah lebih jauh dan mempelajari kueri MongoDB lanjutan untuk dokumen bersarang menggunakan operator $elemMatch dari contoh praktis. Kami masih akan menggunakan mongosh_ untuk menjalankan kueri di konsol sehingga Anda tidak perlu memasang apa pun tambahan. Namun, Anda dapat menggunakan IDE grafis untuk MongoDB jika Anda lebih suka bekerja di lingkungan visual

Gambar dari Pixabay

Sebelum kita memulai perjalanan lanjutan ini, kita harus memiliki server MongoDB. Anda dapat menggunakan Docker untuk memulai server MongoDB dalam wadah, atau menggunakan MongoDB Atlas untuk memulai server yang dihosting dan dikelola oleh Atlas. Untuk kesederhanaan, kami akan menggunakan wadah Docker di posting ini, tetapi Anda bebas memilih yang Anda sukai. Perintah untuk memulai wadah Docker untuk MongoDB adalah

$ docker network create mongo-net$ docker run --detach --network mongo-net --name mongo-server \
--env MONGO_INITDB_ROOT_USERNAME=admin \
--env MONGO_INITDB_ROOT_PASSWORD=pass \
--env MONGO_INITDB_ROOT_DATABASE=admin \
--volume mongo-data:/data/db \
--publish 27017:27017 \
mongo:5.0.6

Anda dapat mongosh di komputer Anda, atau menggunakan yang disertakan dengan wadah Docker

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_

Sekarang kita dapat mulai bekerja dengan database MongoDB menggunakan mongosh. Jika ini adalah pertama kalinya Anda bekerja mongosh, disarankan Anda memeriksa posting pengantar ini terlebih dahulu agar Anda tidak tersesat dalam pertanyaan lanjutan

Data yang akan kita gunakan dalam postingan ini adalah beberapa data produk untuk toko online laptop, seperti yang ditunjukkan pada postingan Elasticsearch. Anda dapat mengunduh file JSON ini untuk mendapatkan data mentah yang akan digunakan

Jika Anda menggunakan mongosh_ di dalam wadah Docker seperti saya, Anda perlu menyalin file JSON ke dalam wadah

$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/

Dan jika Anda menggunakan

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_0 yang diinstal di komputer Anda, Anda harus memiliki file JSON ini di direktori kerja Anda saat ini. Kemudian kita dapat memuat file ini dan memasukkan semua dokumen ke dalam koleksi

Poin kunci untuk kode di atas

  • Kami menggunakan
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    _1 untuk mendeklarasikan database MongoDB yang disebut
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    2, yang akan dibuat saat dokumen dimasukkan ke dalam koleksi di dalamnya
  • Data JSON dimuat oleh perintah
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    3. Dan data yang dimuat dalam format yang dapat digunakan oleh metode
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    4 secara langsung. Data laptop dimasukkan ke dalam koleksi yang disebut
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    5
  • $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    6 digunakan untuk memeriksa jumlah dokumen dalam koleksi dan metode
    $ docker exec -it mongo-server bash
    $ mongosh "mongodb://admin:pass@localhost:27017"
    7 digunakan untuk menunjukkan dokumen pertama dalam koleksi

Sekarang datanya sudah siap, kita bisa mulai menulis beberapa query untuk itu

Seperti yang kita lihat, dokumen laptop dalam koleksi

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
5 memiliki bidang
$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 yang merupakan larik dokumen tersemat. Lebih kompleks untuk membuat kueri dan memperbarui bidang seperti ini daripada bidang sederhana yang tidak bersarang

Pertama, mari cari semua laptop yang CPU-nya

$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
0. Ini seharusnya cukup sederhana karena CPU tidak ambigu

Perhatikan bahwa bidang bersarang ditanyakan dengan notasi titik dan harus diberi tanda kutip. Jika Anda lebih suka menulis kueri yang mencakup banyak baris dengan IDE grafis, silakan lihat posting ini mengenai IDE untuk MongoDB

Kita harus mendapatkan hasil yang kita inginkan karena hanya ada satu dokumen bersarang di array

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 yang memiliki nilai untuk model CPU

Sekarang mari kita cari semua laptop yang memiliki memori 16GB. Secara intuitif, Anda mungkin ingin menggunakan kueri seperti ini

Saat kueri di atas dijalankan, sepertinya semua laptop yang memorinya 16GB dikembalikan

Namun, di sinilah banyak pemula MongoDB membuat kesalahan dan di mana beberapa bug dimasukkan ke dalam kode Anda. Jika Anda memasukkan "itu" di mongosh untuk menampilkan lebih banyak hasil atau cukup gulir ke bawah dekat bagian bawah halaman hasil dengan IDE dan periksa dengan cermat, Anda akan menemukan sesuatu yang aneh

Kami mendapatkan laptop yang penyimpanannya 16GB juga dengan kueri di atas. Ini karena kueri di atas menemukan dokumen di mana larik

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
9 memiliki setidaknya satu dokumen tersemat yang berisi bidang
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 sama dengan
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5 dan setidaknya satu dokumen tersemat [tetapi tidak harus dokumen tersemat yang sama] yang berisi bidang
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
6 sama dengan
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
7

Karena semua array

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_9 memiliki dokumen tersemat yang
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
4 adalah
$ docker cp ./laptops_demo_for_mongodb.json mongo-server:/
5, kueri di atas memberikan hasil yang salah. Apa yang kita inginkan adalah bahwa kedua syarat tersebut harus dipenuhi untuk dokumen tersemat yang sama. Untuk mencapai ini, kami tidak dapat meminta dengan notasi titik seperti yang ditunjukkan di atas tetapi perlu menggunakan operator $elemMatch

Kali ini laptop yang penyimpanannya 16GB tetapi memorinya bukan 16GB tidak akan dikembalikan. Jika tidak percaya, Anda bisa menghitung jumlah dokumen yang dikembalikan oleh kedua query tersebut

Sekarang mari kita coba kasus yang lebih rumit dan temukan semua laptop yang memorinya 16GB dan penyimpanannya 1TB. Kita perlu menggunakan operator mongosh_2 untuk menentukan kondisi untuk dua dokumen bersarang, yang sangat mirip dengan penggunaan kata kunci mongosh3 dan mongosh4 di Elasticsearch untuk kueri dokumen bersarang

Permintaan ini akan mengembalikan hasil yang kita inginkan

Perhatikan bahwa meskipun operator mongosh_2 adalah operator default di MongoDB, itu wajib di sini karena kami menanyakan bidang yang sama dalam dua kondisi berbeda. Jika tidak, kami hanya akan menanyakan kondisi kedua dan akan mendapatkan hasil yang salah

Anda akan mendapatkan satu hasil yang salah dalam kasus ini. Jika Anda mencoba dengan kondisi lain, Anda akan mendapatkan hasil yang lebih salah

Setelah Anda mengetahui cara membuat kueri array dengan dokumen bersarang, seharusnya cukup mudah untuk memperbaruinya. Perhatikan bahwa dokumen bersarang diurutkan dalam larik dan karena itu Anda dapat mengakses dokumen bersarang berdasarkan posisi indeks

Mari perbarui memori menjadi 16GB untuk laptop dengan mongosh6 sama dengan 1

Jika kami memeriksa laptop ini sekarang, atributnya seharusnya sudah diperbarui

Di sini kami menggunakan proyeksi untuk hanya menampilkan bidang

$ docker exec -it mongo-server bash
$ mongosh "mongodb://admin:pass@localhost:27017"
_9 dari dokumen

Bersulang. Dokumen bersarang berhasil diperbarui

Dalam posting ini, kami telah memperkenalkan cara membuat kueri dan memperbarui array dokumen bersarang di MongoDB. Ini adalah penggunaan tingkat lanjut tetapi sangat umum dalam praktiknya. Saya yakin Anda cukup percaya diri dalam menangani masalah semacam ini dalam pekerjaan Anda sekarang

Bisakah kita membuat koleksi bersarang di MongoDB?

Atau dengan kata lain, ketika suatu koleksi memiliki dokumen, dokumen ini berisi dokumen lain, dokumen lain berisi sub-dokumen lain, dan seterusnya, maka jenis dokumen tersebut dikenal sebagai dokumen yang disematkan/bersarang. Di MongoDB, Anda hanya dapat menyarangkan dokumen hingga 100 level .

Bagaimana cara saya meminta banyak nilai di MongoDB?

MongoDB menyediakan find[] yang digunakan untuk menemukan banyak nilai atau dokumen dari koleksi. Metode find[] mengembalikan kursor dari kumpulan hasil dan mencetak semua dokumen. Untuk menemukan banyak nilai, kita dapat menggunakan operasi agregasi yang disediakan oleh MongoDB itu sendiri.

Bagaimana cara mencari di dalam array di MongoDB?

Untuk menanyakan apakah bidang larik berisi setidaknya satu elemen dengan nilai yang ditentukan, gunakan filter { . Untuk menentukan kondisi pada elemen dalam bidang larik, gunakan operator kueri dalam dokumen filter kueri. {

Bagaimana cara menanyakan array objek di MongoDB?

Untuk mencari larik objek di MongoDB, Anda dapat menggunakan operator $elemMatch . Operator ini memungkinkan kita untuk mencari lebih dari satu komponen dari sebuah objek array.

Bài mới nhất

Chủ Đề