如果字段存在,我想更新嵌入數組,否則使用指定的字段創建新文檔。如果它存在,則更新文檔中的嵌入數組,否則創建一個新文檔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"
}
]
}
]
}
]