Wie überprüfe ich, ob ein Array-Feld einen eindeutigen Wert oder ein anderes Array in MongoDB enthält?

143

Ich benutze jetzt Mongodb.

Ich habe eine Blogpost-Sammlung, und Blogpost hat Tags abgelegt, die ein Array sind, z

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

Wie kann ich diese Suchen durchführen?

  1. enthält 'tag1'
  2. enthält ['tag1', 'tag2'],
  3. enthält eines von ['tag3', 'tag4']
guilin 桂林
quelle

Antworten:

219

Probieren Sie es aus:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3
Jeff der Bär
quelle
6
Dies ist gut dokumentiert in der Hilfe: mongodb.org/display/DOCS/…
Scott Hernandez
2
bedeutet für $ all alle Elemente UND in der angegebenen Reihenfolge oder ist es nur ungeordnet?
Redben
2
@ScottHernandez Ich sehe nicht, dass sie erwähnen, dass das Feld, das Sie als Ihre Suche verwenden, ein Array sein kann, und wie das gehandhabt wird. "Feld: {$ in: Array}". Was passiert, wenn Sie innerhalb eines Arrays von Arrays nach einem Array suchen? Unbestimmt.
Zut
Gibt es eine INDEXIERUNG, die wir für Arrays durchführen können, um das Duplizieren zu stoppen? Wenn ja, geben Sie bitte an, wie.
Hitesh Joshi
1
@redben ist ungeordnet wie in den Dokumenten geschrieben: $ all Operator DOCS . Lesen Sie einfach den Beispielteil und Sie werden sehen.
Matthias B
5

Ich habe die Erfahrung gemacht, dass für (2) die folgende Lösung viel schneller ist als die mit "$ all":

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

aber um ehrlich zu sein, ich weiß nicht warum. Ich würde mich interessieren, wenn jemand weiß.

heinob
quelle
1
Übrigens, habe es gerade auf der Liste der indizierten Schlüsselwörter getestet. Absolut das gleiche Ergebnis mit $ und und $ all
isox
Vielleicht hat sich das in der Zwischenzeit mit neueren Versionen geändert.
Heinob
Es ist umständlich. Für die "$ und" macht Mongodb eine logische "und" Operation. Wenn daher der erste Ausdruck falsch ist, werden die zweiten nicht berücksichtigt. Dies bedeutet weniger Verarbeitung.
Kubudi
Aber das sollte auch mit '$ all' passieren, oder?
Heinob
1
$ all ist wahrscheinlich zwei Lookups in einem Index, $ und ist wahrscheinlich ein Lookup mit einem sequentiellen Scan des Ergebnisses.
Evan Carroll