2016-08-04 101 views
0

如果字段存在,我想更新嵌入數組,否則使用指定的字段創建新文檔。如果它存在,則更新文檔中的嵌入數組,否則創建一個新文檔MongoDB NodeJS

tldr:我有以下更新查詢,只更新第一個文檔中的嵌入數組。例如:如果第一個文檔的嵌入式數組「設備」中不存在mac_address,則不會查看其他文檔。

要設置/更新設備的狀態,我有更新查詢並插入新數據(如果它不存在;我正在通過更新函數中的if(!result.nModified)檢查條件。

當我運行此代碼時,它只會在mac_address的第一個文檔中查找(如果存在),它會更新...是的,它可以工作!

如果它不存在 - >它會創建一個新文檔。是的,它的作品。

然後,如果是檢查新文檔中最後插入的mac_address,它將重新插入它並形成重複項。

更新函數只適用於第一個文檔,它會跳過其餘部分。

任何幫助將非常感激。我一直在尋找最近一週左右的解決方案。嘗試了所有可能的解決方案;但它並不像我希望的那樣按照規定行事。

Mac和狀態是此代碼之前定義的變量:

db.devices.update({ 
     'devices.mac_address': mac 
    }, { 
     $set: { 
     'devices.$.state': state 
     } 
    }, 
    function(err, result) { 
     if (err) { 
     console.log('error: ' + err); 
     } 
     console.log('result-->' + JSON.stringify(result)); 

     if (!result.nModified) { 
     db.devices.insert({ 
      name: 'undefined', 
      'devices': [{ 
       '_id': new mongojs.ObjectID(), 
       'name': 'undefined', 
       'type': 'undefined', 
       'state': state, 
       'ip_address': ip_address, 
       'mac_address': mac, 
       'update_timestamp': new Date(), 
       'power': [{ 
       'value': '22', 
       'time': new Date() 
       }] 
      }] 
      }, 
      function(err, result) { 
      if (err) { 
       console.log('error: ' + err); 
      } 
      console.log('result-->' + result); 
      }); 
     } 
    }); 

這是我的JSON文件。

[ 
    { 
     "_id": "579a8116077f4a6fc78188c8", 
     "name": "Bedroom", 
     "devices": [ 
     { 
      "_id": "579a82ebe3648480708be146", 
      "name": "Smart Switch", 
      "type": "switch", 
      "state": "on", 
      "ip_address": "192.168.4.22", 
      "mac_address": "5c:cf:7f:03:35:ab", 
      "update_timestamp": "2016-07-28T22:10:51.957Z", 
      "power": [ 
       { 
        "value": "5000", 
        "time": "2016-07-28T22:10:51.957Z" 
       } 
      ] 
     }, 
    { 
     "_id": "57a2e0b1a6fdb70d35e95dfb", 
     "name": "Living Room", 
     "devices": [ 
     { 
      "_id": "57a2e0b1a6fdb70d35e95dfa", 
      "name": "Ceiling Fan", 
      "type": "switch", 
      "state": "disconnected", 
      "ip_address": "142.58.184.155", 
      "mac_address": "5c:cf:7f:03:35:aa", 
      "update_timestamp": "2016-08-04T06:29:05.247Z", 
      "power": [ 
       { 
        "value": "120", 
        "time": "2016-08-04T06:29:05.247Z" 
       } 
      ] 
     } 
     ] 
    } 
] 

回答

0

所以我最終最終解決了我的問題,並且我發佈了我的解決方案給任何可能有類似或接近我所遇到的問題的人。

我使用的if條件都是錯的。我正在用!檢查'nModified'。我不得不用nModified === 0來替換它,因爲當沒有東西需要更新時它返回0,它告訴我們這是一個新記錄。

下面是修改和更新工作代碼:

db.test.update({ 
     'devices.mac_address': mac 
    }, { 
     $set: { 
     'devices.$.state': state, 
     'devices.$.update_timestamp': new Date(), 
     }, 
    $push: {'devices.$.power': {'value': power, 'time': new Date()}} 
    }, { 
     upsert: false 
    }, 
    function(err, result) { 
     if (err) { 
     console.log('error: ' + err); 
     } 

     console.log('Updated Existing Device: ' + JSON.stringify(result)); 
     if (result.nModified === 0) { 
     console.log('NEW DEVICE!!'); 

      db.test.insert({ 
       'room_name': 'Unassigned', 
       'devices': [{ 
       'name': 'Unassigned', 
       'type': 'Unassigned', 
       'state': state, 
       'ip_address': ip_address, 
       'mac_address': mac, 
       'update_timestamp': new Date(), 
       'power': [] 
       }] 

      }, 
      function(err, result) { 
       if (err) { 
       console.log('error: ' + err); 
       } 
       console.log('NEW DEVICE ADDED RESULTS: ' + JSON.stringify(result)); 
      }); 
     } 
    }); 
相關問題