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.