Предполагая, var friend = { firstName: 'Harry', lastName: 'Potter' };
Есть два варианта:
Обновление модели в памяти и сохранение (простой javascript array.push):
person.friends.push(friend);
person.save(done);
или
PersonModel.update(
{ _id: person._id },
{ $push: { friends: friend } },
done
);
Я всегда стараюсь и выбираю первый вариант, когда это возможно, потому что он будет уважать больше преимуществ, которые дает вам мангуст (крючки, проверка и т. д.), ,
Однако, если вы делаете много одновременных записей, вы столкнетесь с условиями гонки, в результате чего вы столкнетесь с неприятными ошибками версий, чтобы остановить вас от замены всей модели каждый раз и потерять предыдущего добавленного вами друга , Так что только переходите к последнему, когда это абсолютно необходимо.
->
путает вывод типа sbcl. Вы должны (-> x)
развернуть x
и (-> x y...)
на (let (($ x)) (-> y...))
loop
и использовать его в большем количестве мест. dolist
с дополнительной мутацией невелик destructuring-bind
вместо, например, (rest (rest ))
. Вы также несовместимы, поскольку иногда вы пишете (cddr...)
для этого. block*
страдает множеством проблем: он использует (let (foo) (setf foo...))
, который вытаскивает вывод типа sbcl. Имя block*
подразумевает, что различные привязки привязаны таким образом, что они могут ссылаться на те ранее определенные вещи, но на самом деле все начальное значение может относиться к любому имени переменной или функции, и если эта переменная не была инициализирована, то она оценивает значение nil , get-x-y-and-z-ranges
действительно нужен использовать loop
. Я думаю, что это тоже неправильно: списки имеют разные длины. first
и т. Д. Возможно, даже структура (!) [/ G9] (sort foo)
может уничтожить foo
. Вам нужно сделать (setf foo (sort foo))
. do
. Используйте loop
. :key
в нескольких местах. defvar
, но я думаю, что вы имеете в виду defparameter
*t*
- глупое имя Возьмем, к примеру, get-x-depth-for-yz-grid
.
(defun get-x-depth-for-yz-grid (planes//yz-plane grid)
(let ((planes (get-planes-including-yz-grid-in planes//yz-plane grid)))
(unless (evenp (length planes))
(error "error in get-x-depth-for-yz-grid"))
(sort planes (lambda (p1 p2) (< (caar p1) (caar p2))))
(do* ((rest planes (cddr rest)) (res 0))
((null rest) res)
(incf res (- (caar (second rest)) (caar (first rest)))))))
style -> ERROR можно заменить ASSERT.
Возможная ошибка -> SORT может быть разрушительным -> убедитесь, что вы иметь свежий список. Если это уже свежо выделено get-planes-including-yz-grid-in
, тогда нам это не нужно.
bug -> SORT возвращает отсортированный список. Сортированный список, возможно, не побочный эффект. -> использовать возвращаемое значение
style -> DO заменено на LOOP.
style -> значение CAAR нечеткое. Найдите лучшее имя или используйте другие структуры данных.
(defun get-x-depth-for-yz-grid (planes//yz-plane grid)
(let ((planes (get-planes-including-yz-grid-in planes//yz-plane grid)))
(assert (evenp (length planes)) (planes)
"error in get-x-depth-for-yz-grid")
(setf planes (sort (copy-list planes) #'< :key #'caar))
(loop for (p1 p2) on planes by #'cddr
sum (- (caar p2) (caar p1)))))