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.