繁体   English   中英

将一维数组转换为二维数组Node.js和MongoDB

[英]Converting 1d array to 2d array nodejs and mongodb

我有一个1-d数组(作为mongoDB查询的输出),基于字段“数字”排序

results = [{
  user: u1,
  number: 1,
  msg: m1
}, {
  user: u2,
  number: 2,
  msg: m2
}, {
  user: u3,
  number: 3,
  msg: m3
}, {
  user: u2,
  number: 4,
  msg: m4
}, {
  user: u1,
  number: 5,
  msg: m5
}]

我想将此数组转换为二维数组,如下所示。 请注意,嵌套数组是根据“数字”字段排序的

newResults = [{
  user: u1,
  msg: [{nmsg: m1, number: 1}, {nmsg: m5, number: 5}]
}, {
  user: u2,
  msg: [{nmsg: m2, number: 2 }, {nmsg: m4, number: 4}]

}, {
  user: u3,
  msg: [{nmsg: m3, number 3}]
}    
}]

我可以通过有2个for循环来做到这一点,但是2个for循环似乎效率很低,因为数组可以增长到非常大的大小。

有没有一种方法,可能是使用库还是直接从mongoDB获得相同的结果?

另外,Mongodb的结构非常简单

{
user
number
msg
}

谢谢

您可以使用mongodb 聚合来完成 您需要按数字排序(使用$ sort ),按用户分组,并生成按键共享同一分组的数据数组(使用$ group$ push )。

db.collection.aggregate([
  { $sort: {number: 1}}, 
  {$group: {
    _id: "$user", 
    msg: {$push: {nmsg: "$msg", number: "$number" }}
  }}
])

得到这样的结果作为您的数据:

{
    "_id" : "u1",
    "msg" : [
            {
                    "nmsg" : "m1",
                    "number" : 1
            },
            {
                    "nmsg" : "m5",
                    "number" : 5
            }
    ]
}
{
    "_id" : "u2",
    "msg" : [
            {
                    "nmsg" : "m2",
                    "number" : 2
            },
            {
                    "nmsg" : "m4",
                    "number" : 4
            }
    ]
}
{ "_id" : "u3", "msg" : [ { "nmsg" : "m3", "number" : 3 } ] }

您可以使用lodash来减少和排序结果。 在下面的示例中,我使用了_.chain() ,因为它使代码更易读并且可以提高效率。

 var results = [ { user: 'u1', number: 1, msg: 'm1' }, { user: 'u2', number: 2, msg: 'm2' }, { user: 'u3', number: 3, msg: 'm3' }, { user: 'u2', number: 4, msg: 'm4' }, { user: 'u1', number: 5, msg: 'm5' } ]; var reduced = _.chain(results) .groupBy('user').toArray().map(function(record) { return { user : _.chain(record).head().get('user'), msg : _.chain(record).map(function(data) { return { nmsg: data.msg, number: data.number }; }).sortBy('number') } }).sortBy('user').value(); var types = [ { name : 'str', pattern : /("(?:\\\\.|[^"\\\\])*")/g }, { name : 'num', pattern : /(\\b[-+]?[0-9]*\\.?[0-9]+\\b)/g } ] document.querySelector('code.javascript').innerHTML = types.reduce(function(code, type) { return code.replace(type.pattern, '<span class="' + type.name + '">$1</span>') }, JSON.stringify(reduced, null, ' ')) 
 code.javascript { font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif; font-size: 12px; white-space: pre; } code.javascript .str { color: #007F00; } code.javascript .num { color: #7F007F; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.0.0/lodash.min.js"></script> <code class="javascript"></code> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM