[英]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.