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

Bisakah saya menjalankan kueri MongoDB mentah di driver node-mongodb-native?

Catatan:Pertanyaan telah berubah - lihat pembaruan di bawah.

Jawaban asli:

Ya.

Alih-alih:

db.tableName.find({ col: 'value' })

Anda menggunakannya sebagai:

db.collection('tableName').find({ col: 'value' }, (err, data) => {
    if (err) {
        // handle error
    } else {
        // you have data here
    }
});

Lihat:http://mongodb.github.io /node-mongodb-native/2.2/api/Collection.html#find

Perbarui

Setelah Anda mengubah pertanyaan dan memposting beberapa komentar, semakin jelas apa yang ingin Anda lakukan.

Untuk mencapai tujuan Anda meniru shell Mongo di Node, Anda perlu mengurai perintah yang diketik oleh pengguna dan menjalankan perintah yang sesuai sambil mengingat:

  1. perbedaan antara SpiderMonkey yang digunakan oleh shell Mongo dan Node dengan V8 dan libuv
  2. perbedaan antara BSON dan JSON
  3. fakta bahwa shell Mongo bekerja secara sinkron dan driver Node bekerja secara tidak sinkron

Bagian terakhir mungkin akan menjadi bagian tersulit bagi Anda. Ingatlah bahwa dalam cangkang Mongo ini sepenuhnya legal:

db.test.find()[0].x;

Di Node .find() metode tidak mengembalikan nilai tetapi membutuhkan panggilan balik atau mengembalikan janji. Ini akan menjadi rumit. db.test.find()[0].x; kasus mungkin relatif mudah ditangani dengan janji (jika Anda memahami janji dengan baik) tetapi ini akan lebih sulit:

db.test.find({x: db.test.find()[0].x});

dan ingat bahwa Anda perlu menangani level bersarang secara sewenang-wenang.

Protokol Mongo

Setelah membaca beberapa komentar, saya pikir perlu dicatat bahwa apa yang sebenarnya Anda kirim ke server Mongo tidak ada hubungannya dengan JavaScript yang Anda tulis di shell Mongo. Shell Mongo menggunakan SpiderMonkey dengan sejumlah fungsi dan objek yang telah ditentukan sebelumnya.

Tetapi Anda tidak benar-benar mengirim JavaScript ke server Mongo sehingga Anda tidak dapat mengirim hal-hal seperti db.collection.find() . Sebaliknya Anda mengirim OP_QUERY biner struct dengan nama koleksi yang dikodekan sebagai cstring dan kueri yang dikodekan sebagai BSON plus sekelompok flag biner. Lihat:

BSON sendiri merupakan format biner dengan sejumlah nilai tingkat rendah yang didefinisikan sebagai byte:

Intinya adalah Anda tidak mengirim ke server Mongo apa pun yang menyerupai apa yang Anda masukkan di shell Mongo. Shell Mongo mem-parsing hal-hal yang Anda ketik menggunakan parser SpiderMonkey dan mengirimkan permintaan biner ke server Mongo yang sebenarnya. Shell Mongo menggunakan JavaScript tetapi Anda tidak berkomunikasi dengan server Mongo dalam JavaScript.

Contoh

Bahkan objek kueri JSON tidak dikirim ke Mongo sebagai JSON. Misalnya, saat Anda mencari dokumen dengan hello properti sama dengan "dunia" Anda akan menggunakan {hello: 'world'} dalam JavaScript atau {"hello": "world"} di JSON tetapi inilah yang dikirim ke server Mongo - oleh shell Mongo atau oleh klien Mongo lainnya:

\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00   

Mengapa begitu berbeda

Untuk memahami mengapa sintaks yang digunakan dalam Node sangat berbeda dari shell Mongo, lihat jawaban ini:




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pencarian Teks Penuh dan Sebagian MongoDB

  2. Mempertahankan urutan permintaan http dalam loop for di javascript

  3. sailsjs menggunakan mongodb tanpa ORM

  4. $geoNear cocok dengan array terdekat

  5. Perbarui Banyak jika ada, jika tidak buat untuk setiap LeadId yang tidak ada Dokumen baru