MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $isArray

Dans MongoDB, vous pouvez utiliser le $isArray opérateur de pipeline d'agrégation pour vérifier si une valeur est un tableau ou non.

Il accepte toute expression valide et renvoie true si l'expression est un tableau, false si ce n'est pas le cas.

Exemple

Supposons que nous ayons une collection appelée test avec les documents suivants :

{ "_id" : 1, "data" : [ ] }
{ "_id" : 2, "data" : [ 1, 2, 3 ] }
{ "_id" : 3, "data" : [ "XS", "M", "L" ] }
{ "_id" : 4, "data" : 123 }
{ "_id" : 5, "data" : "Homer Jay" }

Nous pouvons utiliser le code suivant pour vérifier les data champ pour les tableaux :

db.test.aggregate(
  [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
    {
      $project:
        { 
          _id: 1,
          data: 1,
          result: { $isArray: "$data" }
        }
    }
  ]
)

Résultat :

{ "_id" : 1, "data" : [ ], "result" : true }
{ "_id" : 2, "data" : [ 1, 2, 3 ], "result" : true }
{ "_id" : 3, "data" : [ "XS", "M", "L" ], "result" : true }
{ "_id" : 4, "data" : 123, "result" : false }
{ "_id" : 5, "data" : "Homer Jay", "result" : false }

Nous pouvons voir que les trois premiers documents contiennent des tableaux et les deux autres non.

De plus, nous pouvons voir que le premier document contient un tableau vide. C'est toujours un tableau, et donc $isArray renvoie true .

Exemple 2

Voici un autre exemple qui contient divers champs de différents types de BSON.

Supposons que nous ayons une collection appelée types avec le document suivant :

{
	"_id" : ObjectId("601738d7c8eb4369cf6ad9de"),
	"double" : 123.75,
	"string" : "123",
	"boolean" : true,
	"date" : ISODate("2020-12-31T23:30:15.123Z"),
	"integer" : 123,
	"long" : NumberLong(123),
	"decimal" : NumberDecimal("123.75"),
	"object" : {
		"a" : 1
	},
	"array" : [
		1,
		2,
		3
	]
}

Pour les besoins de cet article, j'ai nommé chaque champ pour refléter son type BSON.

Nous pouvons maintenant utiliser le code suivant pour renvoyer soit true ou false pour chaque champ, selon que le champ est un tableau ou non :

db.types.aggregate(
  [
    {
      $project:
        { 
          _id: { $isArray: "$_id" },
          double: { $isArray: "$double" },
          string: { $isArray: "$string" },
          boolean: { $isArray: "$boolean" },
          date: { $isArray: "$date" },
          integer: { $isArray: "$integer" },
          long: { $isArray: "$long" },
          decimal: { $isArray: "$decimal" },
          object: { $isArray: "$object" },
          array: { $isArray: "$array" }
        }
    }
  ]
).pretty()

Résultat :

{
	"_id" : false,
	"double" : false,
	"string" : false,
	"boolean" : false,
	"date" : false,
	"integer" : false,
	"long" : false,
	"decimal" : false,
	"object" : false,
	"array" : true
}

Champ manquant

Application de $isArray à un champ qui n'existe pas donne false .

Supposons que notre test collection contient le document suivant :

{ "_id" : 6 }

Et nous appliquons $isArray à ce document :

db.test.aggregate(
  [
     { $match: { _id: { $in: [ 6 ] } } },
    {
      $project:
        { 
          _id: 1,
          data: 1,
          result: { $isArray: "$data" }
        }
    }
  ]
)

Résultat :

{ "_id" : 6, "result" : false }

Valeurs nulles

Application de $isArray à null renvoie false .

Supposons que notre test collection contient le document suivant :

{ "_id" : 7, "data" : null }

Et nous appliquons $isArray à ce document :

db.test.aggregate(
  [
     { $match: { _id: { $in: [ 7 ] } } },
    {
      $project:
        { 
          _id: 1,
          data: 1,
          result: { $isArray: "$data" }
        }
    }
  ]
)

Résultat :

{ "_id" : 7, "data" : null, "result" : false }

Valeurs non définies

De même, fournir des valeurs indéfinies renvoie false .

Supposons que notre test collection contient le document suivant :

{ "_id" : 8, "data" : undefined }

Appliquer $isArray :

db.test.aggregate(
  [
     { $match: { _id: { $in: [ 8 ] } } },
    {
      $project:
        { 
          _id: 1,
          data: 1,
          result: { $isArray: "$data" }
        }
    }
  ]
)

Résultat :

{ "_id" : 8, "data" : undefined, "result" : false }