0

は現在、私はすべてのPageの文書で使用されているすべてのTag文書を検索し、occurrencesの数をカウントし、各Tag文書にそれらを添付この機能は戻ってきた:集計を使用して、そのメソッドから返されていないドキュメントも含めるにはどうすればよいですか?

exports.getAll = (req, res, next) => { 

    const config = utils.prepareOptions(req.query); 

    async.waterfall([ 
    (done) => { 

     Tag.count({}).exec((err, total) => { 
     return done(err, total); 
     }); 
    } 
    ], (err, total) => { 

    Page.aggregate([ 
     // { 
     // $unwind: "$tags" 
     // }, 
     { 
     $group: { 
      _id: "$tags", 
      occurrences: { 
      $sum: 1 
      } 
     } 
     }, 
     { 
     $lookup: { 
      from: "tags", 
      localField: "_id", // this is supposely wrong but I can't prove it 
      foreignField: "_id", 
      as: "tagsData" 
     } 
     }, 
     { 
     $unwind: "$tagsData" 
     }, 
     { 
     $match: { 
      "tagsData.label": new RegExp(config.query, 'i') 
     } 
     }, 
     { 
     $project: { 
      occurrences: "$occurrences", 
      tagData: '$tagsData' 
     } 
     }, 
     { 
     $addFields: { 
      "tagData._id": "$_id", 
      "tagData.occurrences": "$occurrences" 
     } 
     }, 
     { 
     $replaceRoot: { 
      newRoot: "$tagData" 
     } 
     }, 
     {$sort: {[config.sortBy]: config.order}}, 
     {$limit: config.limit}, 
     {$skip: config.offset} 
     ], (err, tags) => { 
     console.log(tags); 
     console.log(err); 
     console.log(total); 
     if (err) { 
      return next(err); 
     } 

     res.json({ 
      error: null, 
      data: tags, 
      total: total, 
      results: tags.length 
     }); 
     }); 
    }); 
}; 

これに伴う問題はTagにはないということです任意の時点で必ずPageと一緒に使用する必要があります。使用されていないTagが返されないため、この関数を呼び出すときに問題が発生します。

私がする必要があるのは、使用されていないTagもすべて含めて、occurrences: 0に設定することです。

[ 
    {_id: 1203f8sad9sf, label: 'Tag 1'}, 
    {_id: 1203asdf89sf, label: 'Tag 2'}, 
    {_id: 1203asqw89sf, label: 'Tag 3'} 
] 

そしてPage文書:私は3枚のTag書類がある場合

だから

{ 
    _id: 90182312, 
    tags: [ObjectId(1203f8sad9sf), Object(1203asdf89sf)] 
} 

そしてTag 1Tag 2を私も返さないか、Pagetags配列の一部でありますTag 3aggregateメソッドから返されたtagsに含まれるようにしますか?

答えて

1

あなたの意図が正しく理解されていることと、ページのtagsフィールドに重複タグIDがないことを確認するコードを用意していると仮定すると、このクエリは実質的に効率的かつ簡潔な方法で書き換えられます:

+0

私はこの質問を投稿して以来、私はすべての種類の巻き戻しとたわごとをしてきました。そして、私がしなければならなかったのは、このLOLでした。あなたは男です。 – Chrillewoodz

+0

大歓迎です! – dnickless

関連する問題