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

Jak najít dokumenty s přesně stejnými položkami pole jako v dotazu

Je zde několik „velmi užitečných případů“, kdy ve skutečnosti snaha vytvořit „jedinečný hash“ nad obsahem pole ve skutečnosti „brání“ nesčetným problémům, které lze snadno vyřešit.

Hledání společného pro „Já“

Pokud například vezmete „uživatel 1“ z poskytnutého vzorku a uvážíte, že tato data již máte načtena a chcete najít „ty, které mám se mnou společné“ podle odpovídajících „itemsIds“ z toho, co má aktuální objekt uživatele, pak jsou dva jednoduché přístupy dotazu:

  1. Najděte „přesně“ totéž: Je to místo, kde chcete zkontrolovat data ostatních uživatelů, abyste viděli ty uživatele, kteří mají stejné „přesné“ zájmy. Toto je jednoduché a „neuspořádané“ použití $all operátor dotazu:

    db.collection.find({ 
        "itemsIds": { "$all": [399957190, 366369952] },
        "userId": { "$ne": 1 }
    })
    

    Což vrátí "user 3", protože to je ten, který má "oba" společné položky "itemsIds". Pořadí zde není důležité, protože jde vždy o shodu v jakémkoli pořadí, pokud jsou tam oba. Toto je další forma $and jako argumenty dotazu.

  2. Najít „podobné“ jako já“: Což je v podstatě otázka „máte něco, co je stejné?“ . K tomu můžete použít $in operátor dotazu. Bude odpovídat, pokud je splněna „kterákoli“ ze zadaných podmínek:

    db.collection.find({ 
        "itemsIds": { "$in": [399957190, 366369952] },
        "userId": { "$ne": 1 }
    })
    

    V tomto případě se „oba“ „uživatel 2“ a „uživatel 3“ budou shodovat, protože „alespoň“ sdílejí „jednu“ ze specifikovaných podmínek, což znamená, že mají „něco společného“ se zdrojovými daty dotazu.

    Toto je ve skutečnosti jiná forma $or dotazovací operátor a stejně jako předtím je mnohem jednodušší a výstižnější psát tímto způsobem vzhledem k podmínkám, které mají být aplikovány.

Hledání společných „věcí“

Existují také případy, kdy možná budete chtít najít věci „společné“, aniž byste měli základního „uživatele“, od kterého byste mohli začít. Jak tedy poznáte, že „user 1“ a „user 2“ sdílejí stejné „itemId“ nebo ve skutečnosti mohou různí uživatelé sdílet stejnou hodnotu „itemIds“ jednotlivě, ale kdo to je?

  1. Získejte přesné shody: Zde se samozřejmě podíváte na hodnoty "itemsIds" a $group je spolu. Obecně platí, že zde platí „objednávka je důležitá“, takže optimálně je máte „předobjednané“ a důsledně vždy, abyste to zjednodušili takto:

    db.collection.aggregate([
        { "$group": {
            "_id": "$itemsIds",
            "common": { "$push": "$userId" }
        }}
    ])
    

    A to je vlastně všechno, pokud už existuje objednávka. Pokud ne, pak můžete udělat o něco delší vinutý formulář pro provedení „objednávky“, ale totéž lze říci o generování „hash“:

    db.collection.aggregate([
        { "$unwind": "$itemsIds" },
        { "$sort": { "_id": 1, "itemsIds": 1 } },
        { "$group": {
            "_id": "$_id",
            "userId": { "$first": "$userId" },
            "itemsIds": { "$push": "$itemsIds" }
        }},
        { "$group": {
            "_id": "$itemsIds",
            "common": { "$push": "$userId" }
        }}
    ])
    

    Není to "super" výkonný, ale je to důvod, proč vždy udržujete pořadí při přidávání položek pole. Což je velmi jednoduchý proces.

  2. Společné „uživatel“ pro „položky“: Což je další jednoduchý proces abstrahující výše s „rozbitím“ pole pod $unwind a poté v podstatě seskupení zpět:

    db.collection.aggregate([
        { "$unwind": "$itemsIds" },
        { "$group": {
            "_id": "$itemsIds",
            "users": { "$addToSet": "$userId" }
        }}
    ])
    

    A opět jen jednoduchý agregátor seskupení $ addToSet provede tuto práci a shromažďuje hodnoty "odlišné userId" pro každou hodnotu "itemsIds".

Toto jsou všechna základní řešení a mohl bych pokračovat s „nastavenými křižovatkami“ a čím ne, ale toto je „základ“.

Nepokoušejte se vypočítat "hash", MongoDB má stejně dobrý "arzenál" pro porovnávání záznamů. Používejte a také „zneužívejte“, dokud se nerozbije. Pak se snažte víc.




  1. Dotaz a vložení pomocí jediného příkazu

  2. Získejte hodnoty jako pole prvků po $lookup

  3. MongoDB:Počet odpovídajících prvků vnořeného pole

  4. Jak na to:Přidejte Cloudera Search do svého clusteru pomocí Cloudera Manager