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']

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

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ß.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.