MongoDb,防止两次创建相同的对象

时间:2019-06-17 09:51:35

标签: node.js mongodb websocket

我要做的就是用MongoDb,Node.js创建数据库并与WebSocket服务器连接,并继续使用Websockets发送的数据更新数据库。 Websockets发送与特定设备ID连接的多种数据。工作正常,建立连接,它会不断更新Mongo,但事实是,有时在第一次发送有关特定设备的数据时,它会两次创建相同的对象。不确定我是否正确解释了我的意思,但想法是在创建设备时不要让Mongo加倍设备。

connection.onmessage = e => {
    const resp = JSON.parse(e.data)
    const server_name = e.target._socket._host.slice(0, 5)
    setTimeout(() => {
        push_data_to_database(resp, server_name)
    },500)

}

push_data_to_database = (message, server) => {
    // console.log("data::::", message)
    deviceControllers.addDevice({device_id: message.device_id, server_name: server})

    if (message.event == 'SCRIPT_START') {
        deviceControllers.updateDevice(
            {device_id: message.device_id},
            {scriptexecute_timestamp: message.timestamp}
        )
    } 
}

以及将设备添加到数据库的功能

exports.addDevice = async(req, resp) => {
    try {
        const validation = await Device.find(req)
        if (!validation.length && req.device_id !== undefined) {
            const device = new Device(req)
            console.log('added:',device)
            return device.save()
        }
    }
    catch (err) {
        throw err
    }
}

1 个答案:

答案 0 :(得分:1)

您可以在集合中为该“ device_id”创建唯一索引,以便添加第二个条目时会出错。此唯一索引可确保索引字段没有重复的值。

db.collection_name.createIndex({“ device_id”:1},{“ unique”:true})

您还可以创建结合多个字段的唯一索引。