2017-03-13 4 views
0

Ich kehrte zu sortieren haben folgende Schema:Mungo, wie Array von Objekten aus Abfrage

const userSchema = new Schema({ 
    local: { 
    email: {type: String, unique: true, sparse: true, lowercase: true, trim: true, required: true}, 
    password: {type: String, required: true}, 
    }, 
    username: {type: String, unique: true, lowercase: true, trim: true}, 
    Items: [{ 
    name: {type: String, trim: true}, 
    createdAt: {type: Date, default: Date.now} 
    }] 
}); 

Und ich verwende die folgende Abfrage alle Elemente abzurufen:

User.findById(req.user.id, 'Items -_id', (err, user) => { ... }); 

die zurück die folgenden:

{ Items: 
    [ 
    { name: 'test1', 
     _id: 58c70800a03d09a31bb7fc17, 
     createdAt: Mon Mar 13 2017 20:58:40 GMT+0000 (GMT) }, 
    { name: 'test2', 
     _id: 58c70826a03d09a31bb7fc18, 
     createdAt: Mon Mar 13 2017 20:59:18 GMT+0000 (GMT) } 
    ] 
} 

Meine Frage ist: Wie kann ich e dit meine mongoose Abfrage, um Objekte innerhalb Items Array in absteigender Reihenfolge basierend auf createdAt Eigenschaft zurückzugeben? d.h. so dass test2 über test1 erscheint.

(einige zusätzliche Informationen, die Elemente Array im Durchschnitt wird der Länge 3-10 pro Benutzer und ich bin mit Nodejs als Backend, aus diesem Grund würde Sortierung der Array auf der App Seite erträglich sein wegen seiner kleine Größe oder zu ineffizient aufgrund Nodejs Single-Thread-Natur?), Danke.

Antwort

0

Sie können eine aggregation verwenden Ihre _id passen, entspannen Items Array, führen Sie eine absteigende Sortierung und Projekt nur Items Feld:

User.aggregate([{ 
    "$match": { 
     "_id": new mongoose.mongo.ObjectId("58c7fa6987200dfc592d088c") 
    } 
}, { 
    "$unwind": "$Items" 
}, { 
    "$sort": { 
     "Items.createdAt": -1 
    } 
}, { 
    "$group": { 
     "Items": { 
      "$push": "$Items" 
     }, 
     "_id": 1 
    } 
}, { 
    "$project": { 
     "_id": 0, 
     "Items": 1 
    } 
}], function(err, res) { 
    console.log(res); 
}) 
+0

diese Lösung die Benutzer-ID innerhalb Array Items für jedes Objekt zurückgibt, wie kann ich die Benutzer-ID vom Abfrageergebnis ausschließen? Und ist diese Abfrage effizienter als die Clientseite mit dem Knoten? Danke – linasmnew

+0

Fügen Sie "_id": 0' in der Projektstufe hinzu, um _id auszuschließen. Aggregation ist ein Mongodb-Feature, es ist viel effizienter als es in Nodejs –

+0

Vielen Dank, ist es auch möglich, es auf die gleiche Weise wie die Ausgabe in meiner ursprünglichen Frage zu formatieren? Es ist also nur ein Array, das Objekte enthält, weil es jetzt ein Array mit Objekten zurückgibt, die für jedes Objekt den Schlüssel "Elemente" enthalten. Danke – linasmnew

Verwandte Themen