5

ノード用のmongodbを使用しています。いくつかの設定フィルタに基づいてドキュメントの集合を集計し、10に制限しようとしています。集計した文書の総数を10に制限する前に集計してください。MongoDBノードドライバ現在の集計の数

ここは私のコードです。

var qry = []; 
if (filter.FocusArea && filter.FocusArea != "(None)") { 
    qry.push({ 
     $match: { 'ProgramAreaId': filter.FocusArea } 
    }); 
} 
if (filter.Status && filter.Status != "(None)") { 
    qry.push({ 
     $match: { 'StatusId': filter.Status } 
    }); 
} 
if (filter.ProgOfficer && filter.ProgOfficer != "(None)") { 
    qry.push({ 
     $match: { 'ProgramOfficerId': filter.ProgOfficer } 
    }); 
} 
if (filter.Fund && filter.Fund != "(None)") { 
    qry.push({ 
     $match: { 'FundId': filter.Fund } 
    }); 
} 
var skipNbr = (parseInt(filter.Page) * 10 - 10); 
qry.push({ $project: { _id: '$_id', count: { $sum: '$$ROOT' }, content: '$$ROOT'} }) // I would like to do the count here. 
qry.push({ $skip: skipNbr }) 
qry.push({ $limit: 10 }) 
var apps = mongo.collection('Applications').aggregate(qry, function(err, docs) { 
    callback(docs); 
}); 

これは1つの集約クエリで実行できますか、2つに分割する必要がありますか?

答えて

2

これは、単一のクエリで行うことができます。

$projectを使用してフィルタリングされた配列を、内容とカウントの2つの異なるフィールドに投影できます。

$sliceを使用してコンテンツ配列を制限することができます。

db.collection.aggregate([ 
    { 
     $match: {} // Filter 
    }, 
    { 
     $group: { 
      _id: 1, 
      array: {$push: '$$ROOT'} 
     } 
    }, 
    { 
     $project: { 
      content: { 
       $slice: ['$array', skip, limit] 
      }, 
      total: { 
       $size: '$array' 
      } 
     } 
    } 
], {allowDiskUse: true}) 
+0

$ arrayはmongoプロパティですか、それとも何かを置いているのですか? – Ohjay44

+0

あなたのコレクションのアイテムの配列です。更新された回答を参照してください。 –

+0

私はあなたがその質問を誤解しているかもしれないと思います。集計された後、制限される前に、コレクション内のすべての文書を集計しようとしています。私はドキュメント内のネストされた配列を扱っていません。 – Ohjay44