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']
guilin 桂林
sumber

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
Jeff the Bear
sumber
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.

heinob
sumber
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