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

Jak najít název pole MongoDB v libovolné hloubce

Máte pravdu v určitém prohlášení, že dokument BSON není dokument XML. Vzhledem k tomu, že XML je načteno do stromové struktury, která se skládá z „uzlů“, je vyhledávání podle libovolného klíče docela snadné.

Zpracování dokumentu MonoDB není tak jednoduché a jedná se o „databázi“ v mnoha ohledech, takže se obecně očekává, že bude mít určitou „jednotnost“ umístění dat, aby bylo snadné „indexovat“ i vyhledávat.

Přesto se to dá zvládnout. Ale to samozřejmě znamená rekurzivní proces spouštějící se na serveru a to znamená zpracování JavaScriptu s $where .

Jako základní příklad shellu, ale obecná function je pouze řetězcový argument pro $where operátor všude jinde:

db.collection.find(
  function () {
    var findKey = "find-this",
        findVal = "please find me";

    function inspectObj(doc) {
      return Object.keys(doc).some(function(key) {
        if ( typeof(doc[key]) == "object" ) {
          return inspectObj(doc[key]);
        } else {
          return ( key == findKey && doc[key] == findVal );
        }
      });
    }
    return inspectObj(this);
  }
)

V zásadě tedy otestujte klíče přítomné v objektu, abyste zjistili, zda odpovídají požadovanému „názvu pole“ a obsahu. Pokud se stane, že jeden z těchto klíčů je "objekt", vraťte se do funkce a znovu zkontrolujte.

JavaScript .some() zajišťuje, že "první" nalezená shoda se vrátí z vyhledávací funkce s true výsledek a vrátí objekt, kde byl tento "klíč/hodnota" v určité hloubce přítomen.

Všimněte si, že $where v podstatě znamená procházení celé vaší kolekce, pokud neexistuje nějaký jiný platný filtr dotazů, který lze použít na "index" v kolekci.

Takže používejte opatrně, nebo vůbec ne a pracujte s restrukturalizací dat do funkčnější podoby.

Ale tohle vám dá shodu.



  1. NoSQL (MongoDB) vs Lucene (nebo Solr) jako vaše databáze

  2. Jak používat Redis z Node.js

  3. StackExchange.Redis.RedisTimeoutException:Časový limit čekání na odpověď

  4. unie ve stejné kolekci v mongodb