sql >> Database >  >> NoSQL >> MongoDB

mangoest subdocument sorteren

Ik had dit als een paar dingen kunnen uitschrijven, maar bij overweging "de mangoest-objecten terugkrijgen" lijkt de belangrijkste overweging te zijn.

Er zijn dus verschillende dingen die je 'zou' kunnen doen. Maar aangezien u "verwijzingen invult" in een object en vervolgens de volgorde van objecten in een array wilt wijzigen, is er maar één manier om dit voor eens en voor altijd op te lossen.

Repareer de gegevens in de volgorde waarin u ze maakt

Als u uw "opmerkingen"-array gesorteerd wilt hebben op de datum waarop ze "created_at" zijn, valt dit zelfs uiteen in meerdere mogelijkheden:

  1. Het "zou" moeten zijn toegevoegd in "invoegvolgorde", dus de "laatste" is de laatste zoals je opmerkt, maar je kunt dit ook "wijzigen" in recente (de afgelopen paar jaar nu) versies van MongoDB met $position als een modifier voor $push :

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

    Dit "zet" het array-element voor aan de bestaande array op de "eerste" (0) index, zodat het altijd vooraan staat.

  2. Als u om logische redenen geen "positionele" updates gebruikt of gewoon waar u "zeker wilt zijn", dan bestaat de $sort modifier naar $push :

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

    En dat zal "sorteren" op de eigenschap van de array-elementendocumenten die de opgegeven waarde voor elke wijziging bevatten. Je kunt zelfs het volgende doen:

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

    En dat sorteert elke "opmerkingen" -array in uw hele verzameling op het opgegeven veld in één hit.

Andere oplossingen zijn mogelijk met behulp van .aggregate() om de array te sorteren en/of "re-casting" naar mangoest-objecten nadat je die bewerking hebt uitgevoerd of nadat je je eigen .sort() hebt gedaan op het gewone object.

Bij beide gaat het in feite om het creëren van een afzonderlijk modelobject en "schema" met de ingesloten items inclusief de "verwezen" informatie. Dus je zou aan die regels kunnen werken, maar het lijkt onnodige overhead te zijn als je de gegevens in de eerste plaats kunt sorteren op de "meest benodigde" middelen.

Het alternatief is om ervoor te zorgen dat velden zoals "virtuals" altijd "serialiseren" in een objectformaat met .toObject() op afroep en leef gewoon met het feit dat alle methoden nu verdwenen zijn en werken met de eigenschappen zoals gepresenteerd.

De laatste is een "gezonde" benadering, maar als wat u gewoonlijk gebruikt de volgorde "created_at" is, dan is het veel logischer om uw gegevens bij elke bewerking op die manier te "opslaan", zodat wanneer u ze "ophaalt", ze in de volgorde die u gaat gebruiken.



  1. Meteor:hoe retourneer ik gegevens uit velden in een specifiek object?

  2. Ophalen uit meerdere, afzonderlijke collecties met Express en MongoDB

  3. Redis™-gegevens migreren met Redis-Shake

  4. hoe records in php bij te werken en in te voegen met mongodb