2014-10-12 95 views
1

我想更新文檔中的數組,並且它能夠正常工作,但是當我想用upsert添加新元素時,將無法運行錯誤。我一直在谷歌上搜索幾個小時,並且我試過的mongodb文檔和我無法操作的文檔。mongo和upsert更新數組

集合的結構是:

{ 
"name" : String, 
"providerId": Number, 
"description": String, 
"providers": [ 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    }, 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    }, 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    } 
] 
} 

使用該查詢以更新現有數據:

db.collection.update({ "providerId": ID, "providers": { $elemMatch: { "merchantId": MERCHANTID }}}, { $set: { 

    "providers.$.merchantId": MERCHANTID, 
    "providers.$.name": NAME, 
    "providers.$.valid": true, 
    "providers.$.data": DATA 

}}); 

這工作正常和正確更新我的陣列的元素。我想當一個元素不存在添加它,不知道是否有項目,但不是如果可能,探測添加upsert({upsert:true})參數,但給我以下錯誤。我認爲這是因爲它不返回任何對象搜索。

這是錯誤:

MongoError:的位置經營者沒有找到查詢所需的匹配。 Unexpanded update:providers。$。name

是否有任何方法更新數組中的子文檔中的數據,並且與添加新數據(如果它們不存在)相兼容?我試圖用運營商$進行搜索,它給了我錯誤;還探索以不同方式搜索({「providers.merchantId」:MERCHANTID})和其他人。

謝謝

+0

您能否讓我知道'providers。$。merchantId'中的$是被調用還是記錄在案?我遇到一些奇怪的問題,並試圖弄清楚究竟是什麼。 – Chris 2016-08-26 14:01:29

回答

1

有一個選項可以實現你想要的。

// step 1 
var writeResult = db.collection.update({ 
    "providerId" : ID, 
    "providers" : { 
     $elemMatch : { 
      "merchantId" : MERCHANTID 
     } 
    } 
}, { 
    $set : { 
     "providers.$.merchantId" : MERCHANTID, 
     "providers.$.name" : NAME, 
     "providers.$.valid" : true, 
     "providers.$.data" : DATA 
    } 
}); 


// step 2 
if (!writeResult.nModified) { // if step 1 has succeeded on update, nModified == 1, else nModified == 0 
    db.collection.update({ 
     "providerId" : ID, 
     "providers.merchantId" : { 
      $ne : MERCHANTID  // this criteria is necessary to avoid concurrent issue 
     } 
    }, { 
     "$push" : { 
      "prividers" : { 
       "merchantId" : MERCHANTID, 
       "name" : NAME, 
       "valid" : true, 
       "data" : DATA 
      } 
     } 
    }); 
} 
+0

好吧,曾經想過做類似的事情,但我認爲,就像他不知道強迫插入一樣。謝謝@Wizard – Anto 2014-10-13 16:24:19

+0

@Anto,您的意思是可能無法找到具有指定的** providerId **的文檔,並且您需要插入整個文檔? – Wizard 2014-10-14 02:16:32

+0

曾經認爲做類似於你所說的事情(做一個更新,如果它返回錯誤嘗試它),但我認爲,就像有一些本地在MongoDB中,如果它不存在添加它,所以問,因爲我是新手,不知道mongoDB的所有操作員和功能;) – Anto 2014-11-08 00:51:23