2016-04-24 15 views
1

を埋め「価格」は昇順で表示されます。マングースソートサブドキュメントは、私が移入される必要があるパスを持っているマングースモデルを持っている

Mongooseのドキュメントが表示されているので(http://mongoosejs.com/docs/api.html#query_Query-populate)、サブパスでソートすることができます。

私の問題は、そうでないことです。

それをやっている私のコードがあります:

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()); 
    } 
}) 

私は質問/回答はこちらを与えるか、マングースのメーリング・リストで、できるだけ多くを読んだことがある:

サブ文書の結果から文書の結果をソートすることはできません。しかし、私はちょうどそのサブ文書のみをソートしたいだけです。ここではいくつかの応答はそれが可能だと言っているようだ:

私はその周りに2つの質問があります。

  • を、それが可能です(マングースのドキュメントが書かれている通り)人口の中でサブ文書を並べ替えるには?
  • これは、他のスキーマにリンクされたObjectIdを置くだけではないという事実にリンクされていますか?

あなたの答えのおかげで、私はできると個人的に)

答えて

0

は、私は可能性として「移入」を使用していません。私は過去に多くのトラブルを経験していました。だから、私はどのように移住中にソートするのか分からない。

populateを使用する代わりに、集計で$ lookupメソッドを使用して、任意のフィールドを簡単にソートできます。それは「人口」とほぼ同じです。

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) { 

     }); 

すべてのフィールドを正しく確認しませんでした。あなたのモデルにこの方法を実装し、これがあなたにいくつかのアイデアを与えることを願ってください。幸運

0

解決策が見つかりました。私の2番目の質問の回答でした。

私の質問のようにあなたのスキーマにサブ文書を書くとき、あなたは1つのモデルと他のものとの間に「関係」を作成していません。つまり、populateメソッドはまったく機能しません。

ObjectIdおよび関連するモデルを参照する必要があります。これは、母集団を使用できるようにするため、Mongooseを提供するオプションです。マングース(などのMongoDB)は、他のコレクションにサブクエリを実行し、それを並べ替えることができますので、

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] 
}); 

は今、.populate方法が機能している:これは一例です。以前は同じモデルであったため、Mongooseは同じコレクションでサブクエリを実行しません(私が理解しているように)。

関連する問題