mongodb - 压缩两个数组并创建新的对象数组
问题描述
大家好,我正在使用 MongoDB 数据库,其中每个数据行如下所示:
{
"_id" : ObjectId("5cf12696e81744d2dfc0000c"),
"contributor": "user1",
"title": "Title 1",
"userhasRate" : [
"51",
"52",
],
"ratings" : [
4,
3
],
}
我需要将其更改为:
{
"_id" : ObjectId("5cf12696e81744d2dfc0000c"),
"contributor": "user1",
"title": "Title 1",
rate : [
{userhasrate: "51", value: 4},
{userhasrate: "52", value: 3},
]
}
我已经尝试使用这种方法,
db.getCollection('contens').aggregate([
{ '$group':{
'rates': {$push:{ value: '$ratings', user: '$userhasRate'}}
}
}
]);
我的结果变成了这样
{
"rates" : [
{
"value" : [
5,
5,
5
],
"user" : [
"51",
"52",
"53"
]
}
]
}
有人可以帮我解决我的问题,
谢谢
解决方案
你可以使用$arrayToObject
and$objectToArray
里面$map
来实现所需的输出。
db.collection.aggregate([
{
"$project": {
"rate": {
"$map": {
"input": {
"$objectToArray": {
"$arrayToObject": {
"$zip": {
"inputs": [
"$userhasRate",
"$ratings"
]
}
}
}
},
"as": "el",
"in": {
"userhasRate": "$$el.k",
"value": "$$el.v"
}
}
}
}
}
])
替代方法
如果userhasRate
包含重复值,则第一个解决方案将不起作用。如果它包含重复值,您可以使用arrayElemAt
and 。$map
$zip
db.collection.aggregate([
{
"$project": {
"rate": {
"$map": {
"input": {
"$zip": {
"inputs": [
"$userhasRate",
"$ratings"
]
}
},
"as": "el",
"in": {
"userhasRate": {
"$arrayElemAt": [
"$$el",
0
]
},
"value": {
"$arrayElemAt": [
"$$el",
1
]
}
}
}
}
}
}
])
推荐阅读
- influxdb - 如何使用 InfluxDB 计算图表下的面积?
- angular - 在 Angular 中重用组件
- javascript - 在使用 D3.js fork 3D Force-Directed Graph 创建的 2D 图形上的鼠标左键上添加鼠标平移
- reactjs - Babel 6: Module parse failed: Unexpected token (ref 是一个 React 组件)
- sql - 从 XML 列中检索 3 级 XML 字段的所有实例
- angular - 无法生成动态形式的离子
- excel - 如何为列中的每个唯一值创建一个新工作簿并复制相应的行数据加模板
- python-3.x - 在 Mac OSX 上安装 pymssql 和 cython 失败
- javascript - 事件目标随机记录为未定义或预期值
- java - 用Java检查和比较数据库中的数据(时间限制)的好方法是什么?