2013-12-10 4 views
0

Я использую базу данных MongoDB в качестве временной таблицы для некоторых операций импорта. Я хочу выполнить хранимую процедуру на данных, прежде чем она будет постоянно сохраняться в нашей базе данных SQL. Это зависит от использования карты внутри Mongo для замены 4 символов из поля int.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 (число - 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-х цифр с одним запросом, сделать другой из четырех цифр замещения сопоставлением с другим, а затем обновить номер в третий запрос? Просто пытаюсь сохранить всю обработку в Монго и максимально упростить. Nevermind, я думаю, это не сработает, потому что мне еще нужно выбрать цифры отображения в запросе обновления ... Черт. – SomeoneRandom

+0

После разговора с моим архитектором мы определили, что дело не в том, чтобы загружать данные в память, поэтому я закончил делать что-то похожее на вас, кроме как с нашими уже определенными методами. Однако это сработало бы, если бы у нас не было этих настроек. Благодаря! – SomeoneRandom

Смежные вопросы