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

Výkon vyhledávání MongoDb

Děkuji za zaslání vysvětlení. Pojďme řešit problémy jeden po druhém.

Za prvé, nemyslím si, že tento dotaz dělá to, co si myslíte, že dělá / chcete, aby dělal. Dovolte mi ukázat vám příklad pomocí mongo shell. Váš dotaz, přeložený do shellu, je

{ "$or" : [
    { "$and" : [
        { "SearchTerms.Key" : "ClientId" }, 
        { "SearchTerms.Value" : "xxx" }
    ]},
    { "$and" : [
        { "SearchTerms.Key" : "CustomerName" },     
        { "SearchTerms.Value" : "Jan" }
    ]}
]}

Tento dotaz najde dokumenty, kde je buď nějaký Key má hodnotu "ClientId" a nějakou Value má hodnotu "xxx" nebo nějaký Key má hodnotu "CustomerName" a nějakou Value hodnotu "Jan". Klíč a hodnota nemusí být součástí stejného prvku pole . Například následující dokument odpovídá vašemu dotazu

{ "SearchTerms" : [
        { "Key" : "ClientId", "Value" : 691 }, 
        { "Key" : "banana", "Value" : "xxx" }
    ]
}

Hádám, že vaše požadované chování je přesně odpovídat dokumentům, které obsahují Key a Value ve stejném prvku pole. $elemMatch operátor je nástroj pro danou úlohu:

{ "$or" : [
    { "SearchTerms" : { "$elemMatch" : { "Key" : "ClientId", "Value" : "xxx" } } },
    { "SearchTerms" : { "$elemMatch" : { "Key" : "CustomerName", "Value" : "Jan" } } }
]}

Za druhé, nemyslím si, že toto schéma je to, co hledáte. Nepopisujete svůj případ použití, takže si nemohu být jistý, ale situace popsaná v tomto příspěvku na blogu je velmi vzácná situace, kdy potřebujete ukládat a vyhledávat libovolně páry klíč–hodnota, které se mohou měnit z jednoho dokumentu na druhý. Je to jako nechat uživatele vkládat vlastní metadata. Téměř žádná aplikace to nechce a nemusí dělat. Vypadá to, že vaše aplikace ukládá informace o zákaznících, pravděpodobně pro interní systém. Měli byste být schopni definovat datový model pro vaše zákazníky, jak vypadá

{
    "CustomerId" : 1234,
    "CustomerName" : "Jan",
    "ClientId" : "xpj1234",
    ...
}

To vše výrazně zjednoduší a zlepší. Myslím, že se zde překřížily dráty, protože někdy lidé nazývají MongoDB „bez schématu“ a blogový příspěvek hovoří o dokumentech „bez schématu“. Příspěvek na blogu skutečně mluví o dokumentech bez schémat, kde nevíte, co tam bude. Většina aplikací by měla téměř přesně vědět, jaká bude obecná struktura dokumentů v kolekci.

Nakonec si myslím, že na základě toho můžeme problém s pomalým dotazem prozatím ignorovat. Pokud potřebujete další pomoc nebo pokud problém nezmizí, když vezmete v úvahu to, co jsem zde řekl, můžete se zeptat na další otázku nebo tuto otázku upravit s dalším vysvětlením.



  1. Jak deaktivovat persistenci s redis?

  2. Proč sada replik mongodb vyžaduje lichý počet hlasovacích uzlů?

  3. Náhodný vzorek z MongoDB vrací silně zkreslené výsledky

  4. MongoDb:najděte hluboce vnořený objekt pomocí $lookup