sql >> Databáze >  >> NoSQL >> MongoDB

Dotaz rozsahu MongoDB na hodnotu celého vloženého dokumentu

Poznamenejte si příkaz o pár řádků níže v dokumentaci, kterou jste propojili:

To vám říká, že neexistující pole a pole nastavená na hodnotu null jsou ošetřena speciálně.

V pořadí dokumentů {} a {a: null} aby bylo v pořadí řazení ekvivalentní, musí třídicí algoritmus považovat chybějící třídicí pole za přítomné a musí mít hodnotu null .

Pokud explicitně přidáte chybějící pole, abyste viděli, jak vypadá, dává řazení větší smysl.

Filtr {tag: { $gte: { baz: MinKey() }}} použito na {_id: 1, tag: {bar: "BAR"}} v podstatě porovnává {baz: MinKey()} s {baz: null, bar: "BAR"} .

V horní části propojené dokumentace je uvedeno, že MinKey je menší než null , takže to je správné řazení.

UPRAVIT

Obecně je dotazování nejúčinnější, když názvy polí nejsou samy o sobě daty. Pokud jde o tabulkovou databázi, který sloupec by obsahoval „baz“?

Drobná změna schématu by tento typ dotazu zjednodušila. Místo {tagname: tagvalue} , použijte {k:tagname, v:tagvalue} . Poté můžete indexovat tag.k a/nebo tag.v a zadejte dotaz na tag.k Chcete-li najít všechny dokumenty se značkou "baz", dotazování značek s operacemi nerovnosti by fungovalo intuitivněji.

db.collection.find({"tag.k":{$gte:"baz"}})

Přesné shody lze provést pomocí elemMatch jako

db.collection.find({tag: {$elemMatch:{k:"baz",v:"BAZ"}}})

Pokud opravdu potřebujete, aby vrácené dokumenty obsahovaly {tagname: tagvalue} , $arrayToObject agregační operátor to může udělat:

db.collection.aggregate([
  {$match: {
      "tag.k": {$gte: "baz"}
  }},
  {
    $addFields: {
      tag: {$arrayToObject: [["$tag"]]}
  }}
])

Hřiště




  1. Připojte se k MongoDB Atlas Cluster db pomocí reaktivní aplikace

  2. Mongo DB najde všechny záznamy s nejvyšší hodnotou v závislosti na klíčovém poli

  3. Push prvek do vnořeného pole mongoose nodejs

  4. Instalace klienta/ovladače PHP 7 MongoDB?