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},
            ]}}
        )

基本上,这个想法是在以后进行,例如电角:[value, value, value, etc.]

您可以使用$ addtoset和$ $每个来更新现有数组。这里$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,,,,]}
}
})

在这里,如果键Ex:battery_message.ChargerState不存在,它将被创建。

注意:

  • 只需确保键battery_messageobject而不是array,如果键是单独的单个密钥而不是嵌套键,请从命令中删除battery_message键。
  • 如果仅必须将单个条目附加到数组中,则比您的查询看起来像:$addToSet:{battery_message.ChargerState: message.data.ChargerState}

最新更新