2017-01-21 6 views
1
配列

のMongoDB - アレイを使用して多くのカウントが

私は以下のコードを使用しようとしていますが、それは動作していないのマングースにおける入力として配列を使用して多くのカウントを行い、返す方法

list2は空として戻っています。

list = ['Ann', 'Bob', 'John', 'Karl']; 
list2 = []; 

for(let i = 0; i < list.length; i++) { 
    Clients.count({name: list[i]}, function(err, doc){ 
     list2.push(doc); 
    }) 
} 
return list2 
+0

Clients.count(に基づいて別の方法があります)非同期関数です。リスト2はすべてのdbクエリが完了する前に実行されるので、リスト2のカウントは消費すると正確ではありません。コールバックや約束によって非同期コードを処理する方法を学ぶ方がよいでしょう。 –

+0

この名前のようなオブジェクトの配列形式でデータを取得した場合、{name: 'Ann'、Count:1}、{name: 'Bob'、Count:3}、{Name: 'John' }] '、それはあなたのために大丈夫でしょうか? –

答えて

2
const async = require('async'); 

var list = ['Ann', 'Bob', 'John', 'Karl']; 

async.map(list, function(item, callback) { 
    result = {}; 
    Clients.count({name: item}, function(err, data) { 
     result[item] = data || 0; 
     return callback(null, result); 
    }); 
}, function(err, data) { 
    console.log(data); 
}); 
3

次のようにして、アグリゲーションパイプラインを実行することができます:

list = ['Ann', 'Bob', 'John', 'Karl']; 
list2 = []; 
Clients.aggregate([ 
    { "$match": { "name": { "$in": list } } }, 
    { 
     "$group": { 
      "_id": "$name", 
      "count": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "list2": { 
       "$push": { 
        "name": "$_id", 
        "count": "$count" 
       } 
      } 
     } 
    } 
]).exec(function(err, results) { 
    list2 = results[0].list2; 
    console.log(list2); 
}); 
0

ここメッドLazhariのanswer

const async = require('async'); 

var list = ['Ann', 'Bob', 'John', 'Karl']; 

var counting = function (item, doneCallback) { 
    var query = Clients.count({name: item}); 
    query.then(function (doc) { 
     return doneCallback(null, doc); 
    }); 
    }; 

async.map(list, counting, function(err, data) { 
    console.log(data); 
}); 
関連する問題