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

Consulta de intervalo do MongoDB em todo o valor do documento incorporado


Observe o comando algumas linhas abaixo na documentação que você vinculou:

Isso está informando que campos inexistentes e campos definidos como nulos são tratados especialmente.

Para os documentos {} e {a: null} para ser equivalente na ordem de classificação, o algoritmo de classificação deve considerar o campo de classificação ausente como presente e ter um valor de null .

Se você adicionar explicitamente o campo ausente, apenas para ver como fica, a ordenação faz mais sentido.

O filtro {tag: { $gte: { baz: MinKey() }}} aplicado a {_id: 1, tag: {bar: "BAR"}} está essencialmente comparando {baz: MinKey()} com {baz: null, bar: "BAR"} .

Perto do topo da documentação que você vinculou, está escrito que MinKey é menor que null , então essa é a ordenação correta.

EDITAR

Em geral, a consulta é mais eficiente quando os nomes dos campos não são dados. Em termos de um banco de dados tabular, qual coluna conteria "baz"?

Uma pequena mudança no esquema simplificaria esse tipo de consulta. Em vez de {tagname: tagvalue} , use {k:tagname, v:tagvalue} . Você pode indexar tag.k e/ou tag.v , e consulte em tag.k para encontrar todos os documentos com uma tag "baz", consultar tags com operações de desigualdade funcionaria de forma mais intuitiva.
db.collection.find({"tag.k":{$gte:"baz"}})

Correspondências exatas podem ser feitas com elemMatch como
db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})

Se você realmente precisa que os documentos retornados contenham {tagname: tagvalue} , o $arrayToObject operador de agregação pode fazer isso:
db.collection.aggregate([
  {$match: {
      "tag.k": {$gte: "baz"}
  }},
  {
    $addFields: {
      tag: {$arrayToObject: [["$tag"]]}
  }}
])

Playground