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

mangoose třídění dílčích dokumentů

Mohl jsem to napsat jako pár věcí, ale při zvažování „získání mangustových předmětů zpět“ se zdá být hlavní úvahou.

Takže jsou různé věci, které "můžete" dělat. Ale protože do objektu "vyplňujete reference" a pak chcete změnit pořadí objektů v poli, existuje opravdu jen jeden způsob, jak to jednou provždy opravit.

Opravte data při vytváření

Pokud chcete, aby vaše pole "komentářů" bylo seřazeno podle data, kdy byly "vytvořeny_at", lze to dokonce rozdělit na několik možností:

  1. „Mělo by být“ přidáno v pořadí „vložení“, takže „nejnovější“ je poslední, jak jste si všimli, ale můžete to také „upravit“ v posledních (před několika lety) verzích MongoDB pomocí $position jako modifikátor $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { "comments": { "$each": [newComment], "$position": 0 } }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Tím se prvek pole "připojí" k existujícímu poli na "první" (0) index, takže je vždy v popředí.

  2. Pokud z logických důvodů nebo jen tam, kde si "chcete být jisti", selhaly aktualizace "pozičních" aktualizací, pak ještě "delší" dobu existuje $sort modifikátor na $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { 
                "comments": { 
                    "$each": [newComment], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    A to „třídí“ podle vlastnosti dokumentů prvků pole, které obsahují zadanou hodnotu při každé úpravě. Můžete dokonce:

    Article.update(
        {  },
        { 
            "$push": { 
                "comments": { 
                    "$each": [], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        { "multi": true },
        function(err,result) {
            // other work in here
        }
    );
    

    A to seřadí každé pole „komentářů“ v celé vaší sbírce podle zadaného pole jedním přístupem.

Další řešení jsou možná pomocí .aggregate() k třídění pole a/nebo „přetypování“ na mongoose objekty poté, co jste provedli tuto operaci nebo po provedení vlastního .sort() na prostém objektu.

Oba tyto ve skutečnosti zahrnují vytvoření samostatného objektu modelu a „schéma“ s vloženými položkami včetně „odkazovaných“ informací. Na těchto řádcích byste tedy mohli pracovat, ale zdá se, že je to zbytečná režie, když můžete data třídit podle toho, co je na prvním místě "nejpotřebnější".

Alternativou je zajistit, aby se pole jako "virtuály" vždy "serializovala" do formátu objektu pomocí .toObject() na zavolání a prostě žít s tím, že všechny metody jsou nyní pryč a pracovat s vlastnostmi tak, jak jsou prezentovány.

Poslední je „rozumný“ přístup, ale pokud to, co obvykle používáte, je pořadí „created_at“, pak dává mnohem větší smysl „ukládat“ svá data tímto způsobem při každé operaci, takže když je „načtete“, zůstanou v pořadí, které budete používat.



  1. Jak vizualizovat použití Resque pomocí Node.js, WebSockets a Redis

  2. jak získat relaci mongoose ve validátoru schématu mongoose

  3. mongodb třídit a regex dotazovat efektivním způsobem

  4. Jak provedu dotaz na pole id v Mongoose?