sql >> Database >  >> NoSQL >> MongoDB

MongoDB $in aggregatiepijplijnoperator

In MongoDB is de $in aggregatiepijplijnoperator retourneert een boolean die aangeeft of een gespecificeerde waarde in de array staat.

De $in aggregatiepijplijnoperator moet niet worden verward met de $in query-operator, die de documenten selecteert waar de waarde van een veld gelijk is aan elke waarde in de opgegeven array.

Voorbeeld

Stel dat we een verzameling hebben met de naam products met de volgende documenten:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }

We kunnen de $in . gebruiken operator om erachter te komen of de sizes veld bevat de waarde L .

Voorbeeld:

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

Resultaat:

{ "_id" : 1, "hasLarge" : false }
{ "_id" : 2, "hasLarge" : true }
{ "_id" : 3, "hasLarge" : true }

Tweede argument moet worden opgelost in een array

Het tweede argument van de $in operator moet oplossen in een array. Als dit niet het geval is, wordt er een fout geretourneerd.

Stel dat we het volgende document aan de collectie toevoegen:

{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" }

Merk op dat de sizes veld is geen array – het is een string.

Laten we $in toepassen naar dat document:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Resultaat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: string",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

In dit geval zijn de sizes veld bevat een string., en daarom wordt een fout geretourneerd.

In dit voorbeeld gebruik ik ook $in met de $match operator om de documenten te filteren naar alleen die waarin ik geïnteresseerd ben. Merk op dat dit de $in gebruikt syntaxis van de queryoperator, die een enkel argument accepteert en niet moet worden verward met de syntaxis van twee argumenten.

Null-waarden

Hetzelfde gebeurt als het tweede argument null . is .

Laten we het volgende document aan de collectie toevoegen:

{ "_id" : 5, "prod" : "Jeans", "sizes" : null }

Dit is wat er gebeurt als we $in proberen te gebruiken met dat document:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Resultaat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: null",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Zelfde fout.

Ontbrekende velden

Hetzelfde geldt voor ontbrekende velden.

Stel dat we het volgende document aan onze collectie toevoegen:

{ "_id" : 6, "prod" : "Shorts" }

En nu proberen we $in . toe te passen naar de (niet-bestaande) sizes veld:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ "L", "$sizes" ] }
          }
     }
   ]
)

Resultaat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$in requires an array as a second argument, found: missing",
	"code" : 40081,
	"codeName" : "Location40081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Regelmatige expressies

In tegenstelling tot de $in query-operator, de $in aggregatiepijplijnoperator ondersteunt het gebruik van reguliere expressies niet.

Daarom resulteert de volgende code niet in een overeenkomst:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            hasLarge: { $in: [ /^X/, "$sizes" ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "hasLarge" : false }
{ "_id" : 2, "hasLarge" : false }
{ "_id" : 3, "hasLarge" : false }

Het resultaat voor alle documenten is false , ook al zijn de sizes veld in alle drie de documenten bevat wel array-elementen die beginnen met de hoofdletter X .


  1. MongooseError - Bewerking `users.findOne()` buffering time-out na 10000ms

  2. Waarom neemt MongoDB zoveel ruimte in beslag?

  3. MongoDB:Subdocument bijwerken

  4. Dupliceer een document in MongoDB met een nieuwe _id