How to accumulate results (with forEach?) in Mongo

2019-07-04 00:30发布

Suppose I want to search through a collection, scan the returned result set and return some transformation of it. I've tried the following code:

db.my_collection.find({timestamp : {$gt: 1343032491799}}, {_id:0,sid:1}).limit(20).forEach(function(element) { print(element.sid); })

Ok, it worked well. To the question: how can I accumulate the results (sids) into an array instead of just printing them?

Update: ruby-style one-liner is preferred (but not required) of course

3条回答
手持菜刀,她持情操
2楼-- · 2019-07-04 01:02

Call toArray on the cursor instead of forEach:

var a = db.my_collection.find(
    {timestamp : {$gt: 1343032491799}}, {_id:0,sid:1}).limit(20)
    .toArray().map(function(o){return o.sid;})

UPDATE

Seems you can skip the toArray and go right to the map as the cursor provides that method directly:

var a = db.my_collection.find(
    {timestamp : {$gt: 1343032491799}}, {_id:0,sid:1}).limit(20)
    .map(function(o){return o.sid;})
查看更多
一夜七次
3楼-- · 2019-07-04 01:04

You can use a variable in the parent scope.

var myArr = []; //the results will go there
db.my_collection.find({timestamp : {$gt: 1343032491799}}, {_id:0,sid:1}).limit(20).forEach(function(element) {
  myArr.push(element.sid); //this function has access to myArr
});
查看更多
一纸荒年 Trace。
4楼-- · 2019-07-04 01:04

Push the id's to a array:

var myArray = [];
b.my_collection.find({timestamp : {$gt: 1343032491799}}, {_id:0,sid:1 })
    .limit(20)
    .forEach(function(element) {
        myArray.push(element.sid);
    })​
查看更多
登录 后发表回答