sql >> Database >  >> NoSQL >> MongoDB

Hoe een array in een verzameling sorteren

Uitgaande van de items in uw products array uniek zijn, is er geen eenvoudige server-side ondersteuning voor het onderhouden van deze array in gesorteerde volgorde zoals bij MongoDB 2.4. Gezien de geneste arrays is de beste optie om de arrays in uw toepassingslogica naar behoren te sorteren (d.w.z. bij invoegen/bijwerken of ophalen/weergeven).

Overwegingen bij gegevensmodellering

Als u veel manipulatie van geneste array-items moet doen, moet u overwegen uw gegevensmodel af te vlakken om het gemakkelijker te maken om mee te werken. Uw ontwerpdoel met MongoDB zou moeten zijn om een ​​gegevensmodel te hebben dat geschikt is voor uw toepassingsscenario's met een acceptabel prestatieevenwicht tussen eenvoudig invoegen/bijwerken/opvragen. Je hoeft zeker niet alles in één collectie/query te modelleren als het geen zin heeft om dat te doen, en je moet bereid zijn om data te denormaliseren (dupliceren). Voor veel-op-veel-relaties zoals producten <=> categorieën is het gebruikelijk om de entiteit die minder vaak wordt bijgewerkt, in te sluiten en te denormaliseren (bijvoorbeeld het insluiten van categorieën in producten).

Aanhoudende gesorteerde, afgedekte arrays (niet-unieke items)

Als u arrays in gesorteerde volgorde wilt bewaren en de items zijn niet uniek, MongoDB 2.4 heeft wel de optie om $push naar een gesorteerde array, maar dit moet worden gebruikt in combinatie met een slice (arraylimiet). Als je $push identieke items aan een gesorteerde array, je krijgt duplicaten (dus dit is waarschijnlijk niet wat je zoekt).

Voorbeeldupdate, uitgaande van page in jouw voorbeeld was de collectienaam:

db.page.update(
    // Query
    { "_id": "56rgt46rt54h68rt4h6" },

    // Update sorted array
    // NB: referring by array index position 0, as there isn't a named reference
    { $push : {
        "categories.0.products" : { 

            // List of new elements to push
            $each : [
                { "name" : "E", "pos": 3 }
            ],

            // Sort by pos (ascending)
            $sort : { "pos" : 1 },

            // Maximum number of array elements (required for $sort)
            $slice : -100
        }
    }}
)



  1. MongoDB staat het gebruik van '.' niet toe in sleutel

  2. Hoe $cond-bewerking te gebruiken in het aggregatieraamwerk van Spring-MongoDb

  3. Mongoose - query om gegevens uit meerdere collecties te krijgen

  4. Hoe zich te ontdoen van Error:OverwriteModelError:Kan het 'undefined' model niet overschrijven nadat het is gecompileerd.?