MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $in Abfrageoperator

In MongoDB ist der $in Der Abfrageoperator wählt die Dokumente aus, bei denen der Wert eines Felds einem beliebigen Wert im angegebenen Array entspricht.

Der $in Der Abfrageoperator ist nicht mit $in zu verwechseln Aggregations-Pipeline-Operator, der einen booleschen Wert zurückgibt, der angibt, ob ein bestimmter Wert im Array enthalten ist.

Beispiel

Angenommen, wir haben eine Sammlung namens products mit folgenden Dokumenten:

{ "_id" : 1, "prod" : "Shorts" }
{ "_id" : 2, "prod" : "Jeans", "sizes" : null }
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
{ "_id" : 4, "prod" : "Shirt", "sizes" : "M" }
{ "_id" : 5, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] }
{ "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

Wir können den $in verwenden Operator, um nur die Dokumente mit einer bestimmten _id auszuwählen Werte.

Beispielcode:

db.products.find({ 
  _id: { $in: [ 1, 2, 3 ] } 
})

Ergebnis:

{ "_id" : 1, "prod" : "Shorts" }
{ "_id" : 2, "prod" : "Jeans", "sizes" : null }
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" }

In diesem Fall wollten wir nur Dokumente, die eine _id enthalten Wert von 1 , 2 , oder 3 .

Beispiel 2

Hier ist ein weiteres Beispiel. Dieses Mal verwenden wir $in gegen ein anderes Feld.

db.products.find({ 
  sizes: { $in: [ "L" ] } 
})

Ergebnis:

{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
{ "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

In diesem Beispiel haben wir $in angewendet zu den sizes Feld.

In diesem Fall hatte das erste Dokument den Wert als Zeichenfolge, während die anderen beiden Dokumente ihn als Array-Element hatten. In jedem Fall wurden alle übereinstimmenden Dokumente zurückgegeben.

Der Vergleich verschiedener Typen wird gemäß der BSON-Vergleichsreihenfolge ausgewertet.

Aggregationsbeispiel

Wir können dieselbe Syntax verwenden, wenn wir $match verwenden Aggregation-Pipeline-Betreiber.

Beispielcode:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } }
   ]
)

Ergebnis:

{ "_id" : 1, "prod" : "Shorts" }
{ "_id" : 2, "prod" : "Jeans", "sizes" : null }
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" }

Und hier ist es wieder beim Abfragen der sizes Feld:

db.products.aggregate(
   [
     { $match: { sizes: { $in: [ "L" ] } } }
   ]
)

Ergebnis:

{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
{ "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

Reguläre Ausdrücke

Sie können reguläre Ausdrücke in der Abfrage verwenden, indem Sie die Form /pattern/ verwenden .

Beispiel:

db.products.find({ 
  sizes: { $in: [ /^X/ ] } 
})

Ergebnis:

{ "_id" : 5, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] }
{ "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

In diesem Beispiel gebe ich alle Dokumente zurück, die einen sizes haben Feld mit einem Wert, der entweder eine Zeichenfolge ist, die mit X beginnt oder ein Array, bei dem mindestens eines der Elemente mit X beginnt .