sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $isArray

I MongoDB kan du använda $isArray aggregeringspipeline-operatör för att kontrollera om ett värde är en array eller inte.

Den accepterar alla giltiga uttryck och returnerar true om uttrycket är en array, false om det inte är det.

Exempel

Anta att vi har en samling som heter test med följande dokument:

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

Vi kan använda följande kod för att kontrollera data fält för arrayer:

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

Resultat:

{ "_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 }

Vi kan se att de tre första dokumenten innehåller arrayer och att de andra två inte gör det.

Vi kan också se att det första dokumentet innehåller en tom array. Det är fortfarande en array, och så $isArray returnerar true .

Exempel 2

Här är ett annat exempel som innehåller olika fält med olika BSON-typer.

Anta att vi har en samling som heter types med följande dokument:

{
	"_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
	]
}

För syftet med den här artikeln har jag döpt varje fält för att återspegla dess BSON-typ.

Vi kan nu använda följande kod för att returnera antingen true eller false för varje fält, beroende på om fältet är en array eller inte:

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()

Resultat:

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

Fält saknas

Använder $isArray till ett fält som inte finns resulterar i false .

Anta att vårt test samlingen innehåller följande dokument:

{ "_id" : 6 }

Och vi tillämpar $isArray till det dokumentet:

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

Resultat:

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

Nullvärden

Använder $isArray till null returnerar false .

Anta att vårt test samlingen innehåller följande dokument:

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

Och vi tillämpar $isArray till det dokumentet:

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

Resultat:

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

Odefinierade värden

På samma sätt returnerar odefinierade värden false .

Anta att vårt test samlingen innehåller följande dokument:

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

Använd $isArray :

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

Resultat:

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

  1. Hur avgör man Redis minnesläcka?

  2. Hur gör jag skiftlägesokänsliga frågor på Mongodb?

  3. Fjäderdata och mongodb - enkel återställning med fjäder inom @Transactional

  4. Robust meddelandeserialisering i Apache Kafka med Apache Avro, del 1