Оператор $ push добавляет указанное значение в массив.
blockquote>{ $push: {
: , ... } } $ push добавляет поле массива со значением как своим элементом.
blockquote>Выше ответ отвечает всем требованиям, но я получил его работу, выполнив следующие
var objFriends = { fname:"fname",lname:"lname",surname:"surname" }; Friend.findOneAndUpdate( { _id: req.body.id }, { $push: { friends: objFriends } }, function (error, success) { if (error) { console.log(error); } else { console.log(success); } }); )
Вздох. Слишком много заламывания рук по неправильной части проблемы. Оператор переключения не является проблемой. Существует много способов выразить "альтернативу", которые не добавляют значение .
проблема значение - не технический выбор оператора.
существует три общих шаблона.
Отображение ключа к объекту . Используйте словарь, если это почти полностью статично, и у Вас есть отображение между простым ключом и другой более сложной вещью. При создавании словаря на лету каждый раз, когда Вам нужен он, глуп. Можно использовать это, если это что Вы среднее : Ваши "условия" являются простыми, статическими значениями ключа та карта к объектам.
Различное поведение среди подклассов . Используйте Полиморфизм вместо объектов проверки типа. Корректный. Если у Вас есть подобные объекты в нескольких классах с различным поведением, они должны быть полиморфными. Используйте это максимально часто.
Другое различное поведение . Используйте if-elif-else лестничную структуру. Используйте это, когда у Вас не будет в основном статического ключа к построению карты ценности. Используйте это, когда условия будут сложны, или Вы средний процедуры, не объекты.
Все остальное - просто хитрый код, который может достигнуть подобных результатов.
Используя Кортеж. Это - просто словарь без отображения. Это требует поиска, и поиска нужно избежать, когда это возможно. Не делайте этого, это неэффективно. Используйте словарь.
Используя функционального декоратора ( http://code.activestate.com/recipes/440499/ ). Неприглядный. Это скрывает if-elif-elif природу проблемы, которую Вы решаете. Не делайте этого, не очевидно, что выбор эксклюзивен . Используйте что-либо еще.
Кто-то даже рекомендовал Посетитель шаблон. Используйте это, когда у Вас есть объект, который следует Составной объект шаблон разработки. Это зависит от полиморфизма для работы, таким образом, это не действительно другое решение.
В первом примере я, конечно, придерживался бы с если еще оператор. На самом деле я не вижу оснований, чтобы не использовать, если еще, если
Вы не находите (использование, например, модуль профиля), что, если оператор является узким местом (очень маловероятный IMO, если у Вас нет огромного количества случаев, которые делают очень мало)
код с помощью словаря более ясен / имеет меньше повторения.
Ваш второй пример я на самом деле переписал бы
setattr(self, name, value)
(вероятно, добавление оператора контроля для ловли недопустимых имен).
Рассмотрение, что это сделано в ответ на пользовательское действие (выбор что-то из меню), и количество выбора, который Вы ожидаете, является очень маленьким, я определенно пошел бы с простой if-elif-else лестничной структурой.
нет никакого смысла в optinizing для скорости, так как это только происходит с такой скоростью, как пользователь может сделать выбор так или иначе, это не "внутренний цикл трассировщика лучей" - территория. Несомненно, имеет значение давать пользователю быструю обратную связь, но так как количество случаев является настолько небольшим, нет никакой опасности этого также.
нет никакого смысла в оптимизации для краткости, начиная с (imo более ясный, нулевой служебный удобочитаемостью), если-лестничная-структура будет так очень коротка так или иначе.
Относительно Ваших вопросов о словаре:
Насколько я знаю, причины выбора dict для быстрого поиска. Когда это гарантировано? когда у меня есть 100 случаев или больше? Действительно ли это - хорошая идея продолжать создавать и выбрасывать словарь каждый раз, когда функция вызвана? Если я создаю dict с этой целью вне функции, я должен проверить, Необходимо ли это elswhere? Что происходит, если это не нужно в другом месте?
Другой проблемой является пригодность для обслуживания. Наличие строки-> curveFunction словарь позволяет Вам диску данных меню. Тогда добавление другой опции является просто вопросом помещения другой строки-> функциональная запись в словаре (который живет в части кода, выделенного конфигурации.
, Даже если у Вас есть только несколько записей, это "разделяет проблемы"; _setCurrentCurve
ответственно за обеспечение электричеством во время выполнения, не определяя поле компонентов.
Создают словарь и содержат на него.
, Даже если это не используется в другом месте, Вы извлекаете вышеупомянутую пользу (locatability, пригодность для обслуживания).
Мое эмпирическое правило состоит в том, чтобы спросить, "Что продолжается здесь?" для каждого компонента моего кода. Если ответ имеет форму
... и ... и ...
(как в "определении библиотеки функций и соединение каждого со значением в меню") тогда существуют некоторые проблемы, просящие быть разделенными.
Каждая из представленных опций соответствует хорошо некоторым сценариям:
Python об удобочитаемости и непротиворечивости и даже если Ваше решение всегда будет субъективным, и это будет зависеть от Вашего стиля, необходимо всегда думать о молитвах Python.
./alex
Я соглашаюсь с df относительно второго примера. Первый пример я, вероятно, попытался бы переписать использование словаря, особенно если у всех конструкторов кривой есть та же подпись типа (возможно, использующий *args и/или ** kwargs). Что-то как
def _setCurrentCurve(self, new_curve):
self.currentCurve = self.preset_curves[new_curve](options_here)
или возможно даже
def _setCurrentCurve(self, new_curve):
self.currentCurve = self.preset_curves[new_curve](**preset_curve_defaults[new_curve])
В Python не делайте событие думает о том, как заменить оператор переключения.
классы Использования и полиморфизм вместо этого. Попытайтесь хранить информацию о каждом availble выборе и как реализовать его в одном месте (т.е. класс, который реализует его).
Иначе Вы закончите тем, что имели много мест, что каждый содержит крошечную часть каждого выбора, и обновление/расширение будет кошмаром обслуживания.
Это - точно вид проблемы, которую OOD пытается решить абстракцией, сокрытием информации, полиморфизмом и партией.
Думают о том, какие классы объектов Вы имеете и их свойства, затем создаете архитектуру OO вокруг них. Таким образом, Вы никогда не должны будете волноваться о недостающем операторе "переключателя" снова.