MongoDB,无需复制键即可将新值推入数组

时间:2019-06-25 06:16:47

标签: javascript mongodb

我是一个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.]

1 个答案:

答案 0 :(得分:2)

您可以将$addToSet$each一起使用来更新现有阵列。仅在数组中不存在值的情况下,$addToSet运算符addsappends才是数组的值。

因此,您的查询可能类似于:

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_messageobject而不是array,并且如果密钥是单独的单个密钥而不是嵌套密钥,请删除命令中的battery_message键。
  • 如果仅要将一个条目附加到数组,则查询将类似于:$addToSet:{battery_message.ChargerState: message.data.ChargerState}