2017-06-30 11 views
1

表示するユーザーのリストがあります。私は分野に基づいて選択したカテゴリやフィルタのユーザーに基づいてのみ1フィルタすなわちフィルタユーザーを適用するとき、私は、適切なフィルタ処理結果を得る2つのフィルタ人口統計の複数の条件に基づいてマングースの結果をフィルタリングする方法は?

1)エリア

2)カテゴリー

を持っています。

ここでは、カテゴリとエリアの両方の選択に基づいてユーザーをフィルタリングする必要があります。 希望する結果を得るにはどうすればよいですか?

以下

は、選択したカテゴリに基づいてユーザーをフィルタするために私の作業コードです:

User.find().populate('city').populate({path: 'categories', match: { name: { $in: filterCatArray }}}).populate('area').exec(function (err, users) { 

     users = users.filter(function(user) { 
       return user.categories; // return only filtered users 
      }); 

     data = {fulldata:users}; 
     res.render('home',{data:data}); 

    }); 

ユーザスキーマ:

 var userSchema = new Schema({ 
     city: {type: mongoose.Schema.Types.ObjectId, ref: 'City',required: true}, 
     area: {type: mongoose.Schema.Types.ObjectId, ref: 'Area', required: true}, 
     categories: [{type: mongoose.Schema.Types.ObjectId, ref: 'Category', required: true}], 
     status: { type: Boolean, default: true }, 
     created_at: Date, 
     updated_at: Date 
    }); 

エリアスキーマ

var areaSchema = new Schema({ 
     city: {type: mongoose.Schema.Types.ObjectId, ref: 'City'}, 
     name: { type: String, required: true}, 
     status: { type: Boolean, default: true }, 
     created_at: Date, 
     updated_at: Date 
    }); 

カテゴリースキーマ

var catSchema = new Schema({ 
     name: { type: String, required: true}, 
     status: { type: Boolean, default: true }, 
     created_at: Date, 
     updated_at: Date 
    }); 

市スキーマ

var citySchema = new Schema({ 
     name: { type: String, required: true}, 
     status: { type: Boolean, default: true }, 
     created_at: Date, 
     updated_at: Date 
    }); 
+0

でしょうが'Users = users.filter(u => u.categories.length> 0) 'ポピュレートの条件が一致しなかった場合、結果の配列は空になるので、それらのユーザーを除外します。あなたの質問に説明されていない他の詳細がない限り。詳しく教える? –

+0

私はMongooseを初めて使っていますが、あなたは 'users = users.filter(u => u.categories.length> 0)'の正確な内容をお知らせできますか? – Anirudh

+0

あなたが質問を編集して現在の出力と何を変更する必要があります。そして、適切に答えることができます。 –

答えて

0

私はaggregationに新たなんだけど、私は最近、それを使用し始めました。私はpopulateが単純なケースには最適だと思いますが、他のコレクションに基づいて結果をフィルタリングするなどの複雑な作業を開始する場合は、集約を使用する必要があります。

これはテストされていないですが、それはおおよそ次のようになります。問題がある場合は何が起こっているかを見るために下からパイプラインの各ステージをコメントし、

UserSchema.aggregate([ 
    // 1 join city collection 
    { 
     $lookup: { 
      from: 'citys', 
      localField: 'city', 
      foreignField: '_id', 
      as: 'city' 
     } 
    }, 
    { 
     $unwind: '$city' 
    }, 
    // 2 join area collection 
    { 
     $lookup: { 
      from: 'areas', 
      localField: 'area', 
      foreignField: '_id', 
      as: 'area' 
     } 
    }, 
    { 
     $unwind: '$area' 
    }, 
    // 3 join categories collection 
    { 
     $unwind: '$categories' 
    }, 
    { 
     $lookup: { 
      from: 'categories', 
      localField: 'categories', 
      foreignField: '_id', 
      as: 'category' 
     } 
    }, 
    // 4 filter results that only have specified categories 
    { 
     $match: { 
      'category.name': { $in: filterCatArray }, 
      'area.name': 'something' // just an example 
     } 
    }, 
    // 5 group results by user 
    { 
     $group: { 
      _id: '$_id', 
      city: { $first: '$city' }, 
      area: { $first: '$area' }, 
      categories: { $push: '$category' }, 
      status: { $first: '$status' }, 
      created_at: { $first: '$created_at' }, 
      updated_at: { $first: '$updated_at' }, 
     } 
    } 
], function (err, users) { 

}); 

。詳細については

、以下のリンク読み:だけではなく、単純にBという

関連する問題