MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Operador de consulta $in do MongoDB


No MongoDB, o $in O operador de consulta seleciona os documentos em que o valor de um campo é igual a qualquer valor na matriz especificada.

O $in operador de consulta não deve ser confundido com o $in operador de pipeline de agregação, que retorna um booleano indicando se um valor especificado está na matriz.

Exemplo


Suponha que tenhamos uma coleção chamada products com os seguintes documentos:
{ "_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" ] }

Podemos usar o $in operador para selecionar apenas os documentos com _id específico valores.

Código de exemplo:
db.products.find({ 
  _id: { $in: [ 1, 2, 3 ] } 
})

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

Nesse caso, queremos apenas documentos que contenham um _id valor de 1 , 2 , ou 3 .

Exemplo 2


Aqui está outro exemplo. Desta vez usamos $in contra um campo diferente.
db.products.find({ 
  sizes: { $in: [ "L" ] } 
})

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

Neste exemplo aplicamos $in para os sizes campo.

Nesse caso, o primeiro documento tinha o valor como uma string, enquanto os outros dois documentos o tinham como um elemento de array. De qualquer forma, todos os documentos correspondentes foram devolvidos.

A comparação de diferentes tipos é avaliada de acordo com a ordem de comparação BSON.

Exemplo de agregação


Podemos usar a mesma sintaxe ao usar o $match operador de pipeline de agregação.

Código de exemplo:
db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } }
   ]
)

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

E aqui está novamente ao consultar os sizes campo:
db.products.aggregate(
   [
     { $match: { sizes: { $in: [ "L" ] } } }
   ]
)

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

Expressões regulares


Você pode usar expressões regulares na consulta usando o formulário /pattern/ .

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

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

Neste exemplo, eu retorno todos os documentos que possuem um sizes campo com um valor que é uma string que começa com X ou uma matriz onde pelo menos um dos elementos começa com X .