2016-04-24 27 views
1
bevölkerten

ich ein Mungo-Modell haben die Pfade aufweisen, die ausgefüllt werden müssen:Mongoose Sortierung Subdokument

var adsSchema = new Schema({                 
    price:  { type: Number, min: 0, required: true }, 
    author:  { type: ObjectId, ref: 'Users', required: true }, 
    title:  { type: String, required: true }, 
    date:  { type: Date, default: Date.now }, 
    offers:  [{         
     price:  { type: Number, required: true },           
     date:  { type: Date, default: Date.now },           
     offerBy: { type: ObjectId, ref: 'Users', required: true }       
    }],                       
    category: { type: ObjectId },                
    images:  [{                    
     type: ObjectId,                   
     ref: 'Images'                   
    }],                       
    videos:  [String]                  
}); 

In einigen GET-Anfrage, ich muss bevölkerten zahlreiche Felder, wie ich sagte, bietet insbesondere mit einer Sortieranlage nach "Preis" nach aufsteigend.

Da die Dokumentation von Mongoose dort angezeigt wird (http://mongoosejs.com/docs/api.html#query_Query-populate), können Sie nach einem Unterpfad sortieren.

Mein Problem ist, dass es nicht der Fall ist.

Es ist mein Code, es zu tun ist:

Ads.findOne({ _id: adId }) 
    .populate({ path: 'author', select: 'firstName lastName' }) 
    .populate('images') 
    .populate({ path: 'offers', options: { sort: { 'price': -1 } }) 
    .populate({ path: 'category', select: 'name' }) 
    .exec(function (err, ad) { 
    if (err) 
     deferred.reject({ status: 500, message: 'Database error.' }); 
    else if (!ad) 
     deferred.reject({ status: 500, message: 'The ad doesn\'t exist!.' }); 
    else { 
       deferred.resolve(ad.toJSON()); 
    } 
}) 

ich so viel wie möglich gelesen haben Fragen/Antworten hier oder in der Mailing-Liste Mongoose geben:

Ich weiß, dass es nicht möglich ist, Dokumente Ergebnisse aus Filialdokument Ergebnis zu sortieren, OK. Aber ich möchte nur dieses Filialdokument sortieren und nur dieses. Einige Antworten hier scheint zu sagen, es ist möglich:

Ich habe 2 Fragen herum:

  • Ist es möglich (wie der Mungo-Dokumentation geschrieben wird) ein Filialdokument während der Bevölkerung zu sortieren?
  • Ist es mit der Tatsache verbunden, dass ich nicht nur eine ObjectId mit einem anderen Schema verknüpft habe?

Vielen Dank für Ihre Antwort;)

Antwort

0

Ich persönlich verwende nicht ‚bevölkern‘ wie möglich, wie ich kann. Ich hatte in der Vergangenheit viele Schwierigkeiten erlebt. Also, ich weiß nicht, wie man beim Befüllen sortiert.

Anstatt population zu verwenden, können Sie die $ lookup-Methode für die Aggregation verwenden, und Sie können jedes Feld einfach sortieren. Es ist fast so wie bei der "Bevölkerung".

Ads.aggregate([ 
     { 
      $lookup: { 
      from: 'Users', 
      localField: 'author', 
      foreignField: '_id', 
      as: 'authorName' 
      } 
     }, 
     { 
      $lookup: { 
      from: 'Images', 
      localField: 'images', 
      foreignField: '_id', 
      as: 'image' 
      } 
     }, 
     { 
      $lookup: { 
      from: 'categories', 
      localField: 'category', 
      foreignField: '_id', 
      as: 'category' 
      } 
     }, 
     { 
      $project: { 
      'authorName.firstName': 1, 
      'image.imagePath': 1, 
      'category.categoryName': 1, 
      '_id': 0 
      } 
     }, 
     { 
      $sort : { 'authorName.firstName' : -1} 
     } 

     ]).exec(function(err, adss) { 

     }); 

Ich habe nicht alle Felder richtig überprüft. Bitte implementieren Sie diesen Weg zu Ihrem Modell und hoffen, dass dies Ihnen eine Idee geben kann. Viel Glück

0

Ich fand die Lösung, und es war die Antwort meiner zweiten Frage.

Wenn Sie ein Filialdokument in Ihrem Schema wie in meiner Frage schreiben, erstellen Sie keine "Beziehung" zwischen einem Modell und einem anderen. Dies bedeutet, dass die Populate-Methode überhaupt nicht funktioniert.

Sie müssen einen Verweis auf eine ObjectId und das zugeordnete Modell erstellen, um befüllen zu können, und so die Optionen, die Ihnen Mongoose bietet.Dies ist ein Beispiel:

var adsSchema = new Schema({ 
    price:  { type: Number, min: 0, required: true }, 
    author:  { type: ObjectId, ref: 'Users', required: true }, 
    offers:  [{ 
     type: ObjectId, 
     ref: 'Offers' 
    }], 
    videos:  [String] 
}); 

Nun wird die .populate Methode funktioniert, weil Mongoose (und so MongoDB) kann die Unterabfrage auf einer anderen Sammlung durchführt und es sortieren. Es war vorher nicht der Fall, weil es im selben Modell war, also führt Mongoose keine Unterabfrage auf derselben Sammlung durch (wie ich es zu verstehen scheint).