Bir dizi alanının MongoDB'de benzersiz bir değer veya başka bir dizi içerip içermediğini nasıl kontrol edebilirim?


144

Şimdi mongodb kullanıyorum.

Blogpost koleksiyonum var ve blogpost bir dizi, örneğin dosyalanmış bir etiket var

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

Bu aramaları nasıl yapabilirim

  1. 'tag1' içeriyor
  2. ['tag1', 'tag2'] içerir,
  3. ['tag3', 'tag4'] öğelerinden birini içeriyor

Yanıtlar:


220

Şunu deneyin:

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

6
Bu yardımda iyi belgelenmiştir: mongodb.org/display/DOCS/…
Scott Hernandez

2
$ all için tüm elemanlar VE ifade edilen sırayla mı yani sadece sıralanmamış mı?
redben

2
@ScottHernandez Arama olarak kullandığınız alanın bir dizi olabileceğinden ve bunun nasıl ele alındığından bahsettiklerini görmüyorum. "field: {$ in: array}". Bir dizi dizideki bir diziyi aradığınızda ne olur? Belirtilmemiş.
Zut

Yinelemeyi durdurmak için dizide yapabileceğimiz herhangi bir INDEXING var mı? Evet ise, nasıl yapılacağını lütfen yönlendirin.
Hitesh Joshi

1
@redben, docs'ta yazılmış gibi sıralanmamış: $ all operator DOCS . Sadece örnek kısmı okuyun ve göreceksiniz.
Matthias B

5

Benim deneyimlerim (2) için aşağıdaki çözüm "$ all" ile olandan çok daha hızlı:

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

ama dürüst olmak gerekirse nedenini bilmiyorum. Herkes bilirse ilgilenirim.


1
Bu arada, dizine alınmış anahtar kelimeler listesinde test ettiniz. $ Ve ve $ all ile kesinlikle aynı sonuç
isox

Belki bu arada daha yeni sürümlerle değişti.
heinob

Durumsal. "$ Ve" için, mongodb mantıklı bir "ve" işlemi yapar. Bu nedenle, ilk ifade yanlışsa, ikincisi dikkate alınmaz. Bu, daha az işlem anlamına gelir.
kubudi

Ama bu '$ all' ile de olmalı, öyle değil mi?
Mart'ta heinob

1
$ all muhtemelen bir dizinde iki arama, $ ve muhtemelen sonuçta sıralı bir taramaya sahip bir aramadır.
Evan Carroll
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.