2016-03-28 127 views
0

让我们假设我有一个具有以下结构的集合;获取一个数组中的所有数组元素mongodb + node.js

{ 
    id:1, 
    name: 'name1', 
    students: ['1', '2' , '3'] 
} 
{ 
    id:2, 
    name: 'name2', 
    students: ['11', '22' , '33'] 
} 
... 

我想让一个数组中的所有学生元素。

我可以做:

db.collection.find({}, {students: 1, _id:0}) 

这将返回我一个数组;

result = [ 
    {students: ['1', '2', '3']}, 
    {students: ['11', '22','33']}, 
] 

但是我想result = ['1', '2', '3', '11', '22','33'];

什么是最有效的方式得到的结果就是这样的?

+0

'变种合并= result.reduce(功能(A,B){ 返回a.students.concat(b.students); });' – Rayon

+2

@RayonDabre上述评论非常有资格成为答案。 –

+0

@Reddy,我的猜测是OP正在寻找一些传统的'mongo方式'来获得预期的结果.. – Rayon

回答

2

如果你想要去的JavaScript的方式,使用Array.prototype.reduce

reduce()方法适用的功能对蓄电池和数组中的每个值(从左到右)将其减少到单个值。

试试这个:

var result = [{ 
 
    students: ['1', '2', '3'] 
 
}, { 
 
    students: ['11', '22', '33'] 
 
}, ]; 
 
var merged = result.reduce(function(a, b) { 
 
    return a.students.concat(b.students); 
 
}); 
 
console.log(merged);

0

可以使用aggragation框架:

db.collection.aggregate([{ 
    $unwind: '$students' 
},{ 
    $group: { 
     _id: '1', 
     students: { 
      $push: '$students' 
     } 
    } 
}]) 
0

尝试用聚合框架。

db.collection.aggregate([ 
    {$project:{_id:0, students:1}}, 
    {$group:{_id:null, result:{$push:"$$ROOT"}}}, 
    {$project:{_id:0, result:1}} 
]) 

这将发出:

{ 
    "result" : [ 
     { 
      "students" : [ 
       "1", 
       "2", 
       "3" 
      ] 
     }, 
     { 
      "students" : [ 
       "11", 
       "22", 
       "33" 
      ] 
     } 
    ] 
}