Bagaimana cara memeriksa apakah bidang array berisi nilai unik atau array lain di MongoDB?


143

Saya menggunakan mongodb sekarang.

Saya memiliki koleksi blogpost, dan blogpost memiliki tag yang diajukan yang merupakan array, misalnya

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

Bagaimana saya bisa melakukan pencarian ini

  1. mengandung 'tag1'
  2. berisi ['tag1', 'tag2'],
  3. berisi ['tag3', 'tag4']

Jawaban:


219

Coba ini:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
Ini didokumentasikan dengan baik dalam bantuan: mongodb.org/display/DOCS/…
Scott Hernandez

2
for the $ all Apakah artinya semua elemen DAN dalam urutan yang dinyatakan atau hanya tidak diurutkan?
redben

2
@ScottHernandez Saya tidak melihat bahwa mereka menyebutkan bahwa bidang yang Anda gunakan sebagai pencarian Anda bisa berupa array, dan bagaimana hal itu ditangani. "bidang: {$ in: array}". Apa yang terjadi ketika Anda mencari array di dalam array array? Tidak ditentukan
Zut

Apakah ada INDEXING yang bisa kita lakukan pada array untuk menghentikan duplikat? Jika ya, mohon panduannya.
Hitesh Joshi

1
@redben tidak teratur seperti yang tertulis dalam dokumen: $ all DOCS operator . Cukup baca bagian contoh dan Anda akan melihat.
Matthias B

5

Pengalaman saya adalah bahwa untuk (2) solusi berikut ini jauh lebih cepat daripada yang dengan "$ all":

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

tapi jujur ​​saja, saya tidak tidak mengapa. Saya akan tertarik, jika ada yang tahu.


1
Omong-omong, baru mengujinya di daftar kata kunci yang diindeks. Benar-benar hasil yang sama dengan $ dan dan $ semua
isox

Mungkin itu berubah dengan versi yang lebih baru.
heinob

Ini tidak langsung. Untuk "$ dan", mongodb membuat operasi logis "dan". Oleh karena itu jika ekspresi pertama salah, yang kedua tidak dipertimbangkan. Ini berarti lebih sedikit pemrosesan.
kubudi

Tapi itu juga harus terjadi dengan '$ all', bukan !?
heinob

1
$ all mungkin adalah dua pencarian pada indeks, $ dan mungkin satu pencarian dengan pemindaian berurutan pada hasilnya.
Evan Carroll
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.