将数组合并到对象到 MongoDB
Posted
技术标签:
【中文标题】将数组合并到对象到 MongoDB【英文标题】:merge array in to objects into MongoDB 【发布时间】:2021-10-25 12:48:08 【问题描述】:说明:我必须将数组TV
和values
合并为对象内部的一个数组。 TV_values
将作为一个数组输出。
"TV":[
"T":"2018-05-05T09:00:00.000Z",
"V":1.3
,
"T":"2018-05-05T09:00:00.000Z",
"V":2.21
],
"values":[
100,
200
]
预期的输出文档
"TV_values":[
"T":"2018-05-05T09:00:00.000Z",
"date":2018-05-05,
"hour": 09,
"V":1.3,
"values":100
,
"T":"2018-05-05T09:00:00.000Z",
"date":2018-05-05,
"hour": 09,
"V":2.21,
"values":200
]
【问题讨论】:
【参考方案1】:在索引上使用映射的解决方案。$map
在计数范围(索引上的映射)上,获取两个数组的元素并将它们合并。 (需要相同尺寸的电视和 VALUES)
它忽略 V
字段,通过索引 TV index 0 与 Value index 0 合并,TV index 1 与 Value index 1 ,我想这就是你想要的。
Test code here
db.collection.aggregate([
"$project":
"TV_VALUES":
"$map":
"input":
"$range": [0,"$size": "$TV"]
,
"as": "i",
"in":
"$let":
"vars":
"tv": "$arrayElemAt": ["$TV","$$i"]
,
"in":
"$mergeObjects": [
"$$tv",
"date":
"$dateToString":
"date": "$toDate": "$$tv.T",
"format": "%Y-%m-%d"
,
"hour": "$hour": "$toDate": "$$tv.T"
,
"values":
"$arrayElemAt": ["$values","$$i"]
]
])
【讨论】:
【参考方案2】:$map
迭代 TV
数组的循环
$indexOfArray
从TV
数组中获取当前元素的索引
$arrayElemAt
从 values
数组中获取特定的索引元素
$toDate
将字符串日期转换为日期类型
$dateToSting
获取格式化日期
$hour
从 T
日期获取小时
$mergeObjects
将当前对象属性与新值`属性合并
db.collection.aggregate([
$project:
"TV_values":
$map:
input: "$TV",
in:
$mergeObjects: [
"$$this",
hour: $hour: $toDate: "$$this.T" ,
date:
$dateToString:
date: $toDate: "$$this.T" ,
format: "%Y-%m-%d"
,
values:
$arrayElemAt: [
"$values",
$indexOfArray: ["$TV.V", "$$this.V"]
]
]
])
Playground
【讨论】:
感谢您的回答:我收到错误消息:'$arrayElemAt 的第二个参数必须在服务器上可以表示为 32 位整数:1.2'。 .我使用的是 mongo db 4.2 版本。 只需要TV_values
中的values
。第一个位置是什么意思?
您可以将TV
中的任何字段作为参考。不,没有唯一的归档
是的,没关系,但我将 V
设为浮点数,而不是整数,我发布了整数值的问题 [mongoplayground.net/p/vozZgALpUPQ](游乐场)也使用浮点数。
不,它不是完美的工作,但如果我做一轮 V
然后它工作,但我希望值作为浮动【参考方案3】:
您可以使用此聚合查询:
首先$unwind
解构数组。
然后根据V
位置的索引-1设置每个值。 (V
1 是索引 0(数组中的位置 1),V
2 是索引 1)
然后重新组合以获得最终对象。
db.collection.aggregate([
"$unwind": "$TV"
,
"$set":
"TV.values":
"$arrayElemAt": [
"$values",
"$subtract": [
"$TV.V",
1
]
]
,
"$group":
"_id": "$_id",
"TV":
"$push": "$TV"
])
例如here
【讨论】:
以上是关于将数组合并到对象到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章