我是一个MongoDB
的初学者,他有任务将新值推送到数据库,但只有将其设置为数组的值,问题是当前查询重复了所有内容,值和键,这里是示例:
"battery_message" : [
{
"ChargerState" : null
},
{
"ChargerStatus" : null
},
{
"OutputVoltage" : null
},
{
"timestamp" : 1561442271.976242
},
{
"ChargerState" : null
},
{
"ChargerStatus" : null
},
{
"OutputVoltage" : null
},
{
"timestamp" : 1561442302.637065
}
],
问题是电池消息中可能会出现一些新日期,因此在我的架构中看起来像这样:
battery_message: Array
这是我的查询:
deviceControllers.updateDevice(
{device_id: message.device_id},
{$push: { battery_message: [
{ChargerState: message.data.ChargerState},
{ChargerStatus: message.data.ChargerStatus},
{OutputVoltage: message.data.OutputVoltage},
{timestamp: message.data.timestamp},
]}}
)
基本上,这个想法是稍后再创建ChargerState:[value, value, value, etc.]
答案 0 :(得分:2)
您可以将$addToSet与$each一起使用来更新现有阵列。仅在数组中不存在值的情况下,$addToSet
运算符adds
或appends
才是数组的值。
因此,您的查询可能类似于:
deviceControllers.updateDevice(
{device_id: message.device_id},
{$addToSet: { battery_message:
{
$each: [
message.data.ChargerState,
message.data.ChargerStatus,
message.data.OutputVoltage,
message.data.timestamp
]
}}})
更新1 ,如果
battery_message
具有以下属性:ChargerState:Array,ChargerStatus:Array,OutputVoltage:Array,timeStamp:Array
deviceControllers.updateDevice(
{device_id: message.device_id},
{$addToSet: {
battery_message.ChargerState:{$each:[value1,value2,,,,]},
battery_message.ChargerStatus:{$each:[value1,value2,,,,]},
battery_message.OutputVoltage:{$each:[value1,value2,,,,]},
battery_message.timestamp:{$each:[value1,value2,,,,]}
}
})
如果密钥battery_message.ChargerState
不存在,则会创建密钥。
注意:
battery_message
是object
而不是array
,并且如果密钥是单独的单个密钥而不是嵌套密钥,请删除命令中的battery_message
键。$addToSet:{battery_message.ChargerState: message.data.ChargerState}