2013-12-10 104 views
0

我正在使用MongoDB數據庫作爲臨時表的一些導入操作。我想在數據永久保存到我們的SQL數據庫之前對數據執行存儲過程。這依賴於使用Mongo內的映射來替換int域中的4個字符。MongoDB選擇內部更新查詢

我不太知道如何在蒙戈做到這一點,但如果這些表是SQL裏面的查詢會是這個樣子:

UPDATE data SET number = 
IF LEN(number) >= 4 BEGIN 
    CONCAT(SUBSTRING(number, 1, (LEN(number)-4)), (SELECT replacement FROM mapping WHERE original=SUBSTRING(number, (LEN(number)-4), 4)) 
END ELSE number 

含義,如果數字是4位數以上,更換在映射表中替換的最後4位數字,否則什麼都不做。

任何人都可以幫我翻譯成一個MongoDB查詢(我使用C#的情況下是相關的)?我現在真的迷路了。

+0

我想,你會寫'LEN(數字) - 4',而不是' LEN(number - 4)'在查詢內部。 – Shad

+0

而第二個'SUBSTRING'調用不帶任何字符串參數。 – Shad

+0

是的,你是對的,解決了這些問題。 – SomeoneRandom

回答

1

你不能做這個工作一個update查詢中,但是你可以使用JavaScript函數用於更新所需的物品:

db.data.find().forEach(function (item) { 
    var numberLength = item.number.length; 
    if (numberLength >= 4) { 
     var part1 = item.number.substring(0, numberLength - 4); 
     var part2 = item.number.substring(numberLength - 4); 

     var mapping = db.mapping.findOne({ original: part2 }); 

     item.number = part1 + (!!mapping ? mapping.replacement : ""); 
     db.data.save(item); 
    } 
}); 
+0

我試圖避免將所有數據加載到內存中,因爲我正在運行此過程的數據的大小。 (一次可以使用多個版本) 也許是另一種解決方案......我可以爲每條記錄添加兩個屬性,使用一個查詢創建一個原始4位數字,使其他4位替換數字與另一個映射進行映射,然後更新數字第三個查詢?只是試圖保持Mongo的所有處理並儘可能精簡。 沒關係,我猜這是行不通的,因爲我仍然需要選擇更新查詢中的映射數字......媽的。 – SomeoneRandom

+0

在與我的架構師談過之後,我們確定將數據加載到內存並不是什麼大事,所以除了我們自己已定義的方法外,我最終還是做了類似於您的事情。但是,如果我們沒有設置這些,這將會奏效。謝謝! – SomeoneRandom